Django-Celery
- pip install django-celery(應該會自動安裝celery等依賴項)
- 在setting文件中的INSTALLED_APPS里面添加‘djcelery’項以及添加如下代碼:
import djcelery
from celery.schedules import crontab
djcelery.setup_loader() # 能自動識別用戶app下tasks.py里面的被@task裝飾的函數
BROKER_URL = 'redis://127.0.0.1:6379/1' # 需要確保redis啟動。
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
- 執行python manage.py syncdb創建celery相關數據表。
- 在自己的app目錄下創建tasks.py文件,并加入如下代碼:
from celery import task
@task
def my_task_func():
# here, write my code
- 執行python manage.py celery worker啟動worker,一個負責執行task的進程
- 若是執行定時任務,還需要執行python manage.py celery beat開啟心跳進程
(用于監聽什么時候應該執行task,并在應當執行時刻,發送信號給worker,然后worker執行task任務 ) - 運行django項目,進入admin后臺的djcelery模塊,添加定時任務。
Django-admin
** Django-admin中自定義后臺的顯示方式 **
from django.utils.html import format_html
class TestModel(models.Model):
GENDER_CHOICES = ((-1, u'女'),(0, u'不詳'),(1, u'男'))
name = models.CharField(max_length=12)
gender = models.SmallIntegerField(u'性別', choices=GENDER_CHOICES)
class TestModelAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'gender', 'colored_gender')
# 自定義gender顯示field
def colored_gender(self, obj): # 自定義函數,包含兩個參數,obj代表數據對象
color = ''
if obj.gender == -1: # 女
color = '#12d012'
elif obj.gender == 0: # 未知
color = 'red'
elif obj.gender == 1: # 男
color = 'yellow'
# 這行中的get_gender_display()函數為django model自帶的特殊方法,具體名稱為get_FIELD_display()
# 功能是獲取FIELD列的顯示字符。特別地,對于有choices選項的field有效(其會返回choices中的對應字符)。
# format_html函數使得后臺顯示時不會按照字符串顯示,而是以html的形式。
return format_html('%s' % (color, obj.get_gender_display()))
colored_gender.short_description = "性別" # 此行使得自定義的field可以按照模型的gender排序。并使得后臺顯示的列名與原生的列有相同樣式
colored_gender.admin_order_field = "gender"
** Django-admin中的添加數據表單時,選擇外鍵的數據需要過濾時 **
class TestModel(models.Model):
user = models.ForeignKey(User, limit_choices_to={'is_admin': True},)
這樣之后,在后臺選擇user時,就只會將User表中是admin的用戶顯示出來。