关于复合模型的解释,我有点不理解

关于复合模型的解释,我有点不理解

复合类型中的四个关键字

ContentType——模型类型

ForeignKey(ContentType)——关联复合模型

GenericForeignKey——关联模型

GenericRelation——反向关联

以下是视频案例

  1. 文件: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'

  1. 文件: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

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕美 2020-09-24 17:32:03

同学,你好。在上传图片表的时候,会选择对应的Content type,商品信息对应的是product表,因此可以知道对应的id是13

http://img1.sycdn.imooc.com//climg/5f6c673509e038fb04620619.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快~~~~

好帮手慕美 2020-09-23 13:38:21

同学,你好。在外键关联时,是与另一个表的主键关联,这里是与ContentType表的主键相关联

例:13对应的是mall中的product表

http://img1.sycdn.imooc.com//climg/5f6adeca0906517303320382.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快~~~~

  • 提问者 丛从绿草 #1
    这里怎么知道它拿的是id=13啊, 而不是其它的id值
    2020-09-24 17:07:54
好帮手慕美 2020-09-21 15:00:59

同学,你好。

1、ContentType是系统自定义的表,content_type = models.ForeignKey(ContentType)该语句与ContentType表做了外键关联,即django_content_type表,该表可以追踪项目中所有app和model的对应关系。该表会记录所有创建的模型,并给一个唯一标识。

2、ContentType只适用于1对多的关系,一张表与多个表使用外键关联时。

3、object_id不是自动生成的,是商品信息的id,在上传图片的时候可以选择的

http://img1.sycdn.imooc.com//climg/5f684d980967762406670076.jpghttp://img1.sycdn.imooc.com//climg/5f684db609497d5705230227.jpg

4、content_object = GenericForeignKey('content_type', 'object_id'):可以通过content_type_id和object_id查询到具体的记录

例:content_type_id是13表示关联的是商品模型,object_id表示关联的哪个商品

http://img1.sycdn.imooc.com//climg/5f684eb109257f3e03200332.jpg

http://img1.sycdn.imooc.com//climg/5f684ebe09e7453006700088.jpg

5、建一个 GenericRelation用于反向查询,不生成字段。使用obj.banners可以关联到ImageFile,查到图片

如果我的回答解决了你的疑惑,请采纳!祝学习愉快~~~~

  • 提问者 丛从绿草 #1
    原来content_type是django 自动生成的表, 外键关联这里是通过id进行关联? 这里的类class ImageFile , content_type = models.ForeignKey(ContentType) 这里没有给任何标识,怎么知道拿的是哪个模型呢, 拿到的是content_type的id嘛? 那拿的是哪个id,我不懂,请老师解答 object_id = models.PositiveIntegerField() 这里商品id要用户输入,我明白了 content_object = GenericForeignKey('content_type', 'object_id')
    2020-09-23 10:02:20
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.从网页搭建入门Python Web
  • 参与学习           人
  • 提交作业       218    份
  • 解答问题       3562    个

本阶段带你用Python开发一个网站,学习主流框架Django+Flask是Python Web开发的第一步,在基础知识上实现积分商城的项目开发,体验真实的项目开发流程,提高解决编程问题和效率的能力。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师