关于复合模型的解释,我有点不理解
复合类型中的四个关键字
ContentType——模型类型
ForeignKey(ContentType)——关联复合模型
GenericForeignKey——关联模型
GenericRelation——反向关联
以下是视频案例
文件:system\models.py
class ImageFile(common.CommonModel):
"""图片表"""
# 202009/xxx
img = models.ImageField('图片', upload_to='%Y%m/images/')
summary = models.CharField('图片名称', max_length=200)
# 关联复合模型
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
is_valid = models.BooleanField('是否有效', default=True)
class Meta:
db_table = 'system_images'
文件:mall/models.py
class Product(common.CommonModel):
"""商品"""
uid = models.UUIDField('商品ID', default=uuid.uuid4, editable=False)
name = models.CharField('商品名称', max_length=128)
desc = models.CharField('简单描述', max_length=256, null=True, blank=True)
content = models.TextField('商品描述')
types = models.SmallIntegerField('商品类型', default=constants.PRODUCT_TYPE_ACTUAL, choices=constants.PRODUCT_TYPES_CHOICES)
price = models.IntegerField('兑换价格(积分兑换)')
origin_price = models.FloatField('原价')
img = models.ImageField('主图', upload_to='product')
buy_link = models.CharField('购买链接', max_length=256, null=True, blank=True)
reorder = models.SmallIntegerField('排序', default=0)
status = models.SmallIntegerField('商品状态', default=constants.PRODUCT_STATUS_LOST,
choices=constants.PRODUCT_STATUS_CHOICES)
sku_count = models.IntegerField('库存', default=0)
ramain_count = models.IntegerField('剩余库存', default=0)
view_count = models.IntegerField('浏览次数', default=0)
score = models.FloatField('商品的评分', default=10.0)
is_valid = models.BooleanField('是否有效', default=True)
tags = models.ManyToManyField(Tag, verbose_name='标签', related_name='tags', on_delete=models.CASCADE,
null=True, blank=True) # 多对多
Classes = models.ManyToManyField(Classify, verbose_name='分类', related_name='classes', on_delete=models.CASCADE,
null=True, blank=True) # 多对多
banners = GenericRelation(ImageFile, verbose_name='banner图', related_query_name='banners')
class Meta:
db_table = 'mall_product'
ordering = ['-reorder']
# 这里的content_type = models.ForeignKey(ContentType) 这个是一对多关联什么?ContentType,是把当前模型定义为复合模型的意思嘛?并且一对多?
object_id = models.PositiveIntegerField() # 这个object_id 只要有图片文件就自动生成的嘛?
#content_object = GenericForeignKey('content_type', 'object_id') 这句关联模型,是通过图片模型字段的Object_id 和content_type把关联的内容拿到是这个意思嘛?
banners = GenericRelation(ImageFile, verbose_name='banner图', related_query_name='banners')
这句是关联ImageFile模型的字段嘛?
正在回答 回答被采纳积分+1
同学,你好。
1、ContentType是系统自定义的表,content_type = models.ForeignKey(ContentType)该语句与ContentType表做了外键关联,即django_content_type表,该表可以追踪项目中所有app和model的对应关系。该表会记录所有创建的模型,并给一个唯一标识。
2、ContentType只适用于1对多的关系,一张表与多个表使用外键关联时。
3、object_id不是自动生成的,是商品信息的id,在上传图片的时候可以选择的
4、content_object = GenericForeignKey('content_type', 'object_id'):可以通过content_type_id和object_id查询到具体的记录
例:content_type_id是13表示关联的是商品模型,object_id表示关联的哪个商品
5、建一个 GenericRelation用于反向查询,不生成字段。使用obj.banners可以关联到ImageFile,查到图片
如果我的回答解决了你的疑惑,请采纳!祝学习愉快~~~~
- 参与学习 人
- 提交作业 218 份
- 解答问题 3562 个
本阶段带你用Python开发一个网站,学习主流框架Django+Flask是Python Web开发的第一步,在基础知识上实现积分商城的项目开发,体验真实的项目开发流程,提高解决编程问题和效率的能力。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星