Django中ContentType学习

模型

models.py

from django.db import models
from django.db.models.fields import exceptions
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.utils import timezone


# Create your models here.
class ReadNum(models.Model):
    read_num = models.IntegerField(default=0)
    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')


class ReadNumExpandMethod:
    def get_read_num(self):
        try:
            ct = ContentType.objects.get_for_model(self)
            readnum = ReadNum.objects.get(content_type=ct, object_id=self.pk)
            return readnum.read_num
        except exceptions.ObjectDoesNotExist:
            return 0


class ReadDetail(models.Model):
    date = models.DateTimeField(default=timezone.now)
    read_num = models.IntegerField(default=0)
    content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

进入交互式命令行

python manage.py shell

查看ContentType调用结果

(InteractiveConsole)
>>> from mysite.models import *
>>> from read_statistics.models import *
>>> from django.shortcuts import get_object_or_404
>>> product_details = get_object_or_404(Product,id=5)  #从Product模型中找到ID值为5的对象
>>> product_details  #查看该对象是什么
>
>>> from django.contrib.contenttypes.models import ContentType #导入ContentType模型
>>> ct = ContentType.objects.get_for_model(product_details) #从ContentType中找寻到这个模型
>>> product_details.id #查看这个模型对应的ID值与上文的初值相同
5
>>> from read_statistics.models import ReadNum, ReadDetail
>>> ReadNum.objects.get_or_create(content_type = ct, object_id=product_details.pk)
(, False) #查看调用ReadNum模型时返回的时什么参数

>>> readnum, created = ReadNum.objects.get_or_create(content_type = ct, object_id=
product_details.pk) #采用相同的参数模式,见名知意
>>> readnum

>>> created
False
>>> readnum.read_num #调用readnum中read_num
1
>>> readnum.id #调用readnum中id
2





你可能感兴趣的:(Django中ContentType学习)