立即登录

注册账号

联系我们

2022年4月16日 10:45

Django知识点之ContentType

2. ContentType

from django.contrib.contenttypes.models import ContentType
# 查询一个ContentType对象
student_type = ContentType.objects.get(app_label='learn',model='student')
student_type
Out[4]: <ContentType: learn | student>
# 通过ContentType对象获取模型
student_type.model_class()
Out[5]: learn.models.Student
from learn.models import Student
# 通过模型获取ContentType对象
ContentType.objects.get_for_model(Student)
Out[8]: <ContentType: learn | student>

models.py

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey

class Action(models.Model):
    user = models.ForeignKey('auth.user', related_name='actions', db_index=True, on_delete=models.CASCADE)
    verb = models.CharField(max_length=255)
    target_ct = models.ForeignKey(ContentType, blank=True, null=True, related_name='target_obj',
                                  on_delete=models.CASCADE)
    target_id = models.PositiveIntegerField(null=True, blank=True, db_index=True)
    target = GenericForeignKey('target_ct', 'target_id')
    created = models.DateTimeField(auto_now_add=True, db_index=True)
    class Meta:
        ordering = ('-created',)

utils.py

import datetime
from django.utils import timezone
from django.contrib.contenttypes.models import ContentType
from .models import Action

def create_action(user, verb, target=None):
    # 检查最后一分钟内的相同动作,避免反复产生动作。
    now = timezone.now()
    last_minute = now - datetime.timedelta(seconds=60)
    similar_actions = Action.objects.filter(user_id=user.id, verb=verb, created__gte=last_minute)
    if target:
        target_ct = ContentType.objects.get_for_model(target)
        similar_actions = similar_actions.filter(target_ct=target_ct, target_id=target.id)
    if not similar_actions:
        # 最后一分钟内找不到相似的记录
        action = Action(user=user, verb=verb, target=target)
        action.save()
        return True
    return False

views.py

class StudentCreateView(CreateView):
    model = Student
    fields = ['name']
    template_name_suffix = '_create'
    success_url = '/students/'

    def form_valid(self, form):
        self.object = form.save()
        create_action(self.request.user, '新建了一个学生', self.object)
        return super().form_valid(form)

留言

给我留言