【问题标题】:How to differentiate multiple GenericForeignKey relation to one model?如何区分多个 GenericForeignKey 与一个模型的关系?
【发布时间】:2020-11-23 11:09:50
【问题描述】:

我的模型结构如下:

class Uploadable(models.Model):    
    file = models.FileField('Datei', upload_to=upload_location, storage=PRIVATE_FILE_STORAGE)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')


class Inspection(models.Model):
    ...
    picture_before = GenericRelation(Uploadable)
    picture_after = GenericRelation(Uploadable)

我想知道如何判断一个文件上传为picture_before,而另一个文件上传为picture_afterUploadable 不包含任何有关它的信息。

谷歌搜索了一段时间,但没有找到合适的解决方案。

感谢支持!

【问题讨论】:

  • 看看使用reverse relations 使用related_query_name。它不会告诉您 Uploaded 实例是 before 还是 after,但它允许您使用反向关系从 Uploaded 实例中获取 before 或 after。
  • 我这样做了,但是哪张图片是“之前”,哪张是“之后”图片的信息在哪里?它需要保存在数据库中的某个地方,对吧?
  • 假设您上传的实例是 picrelated_query_name="before_pics" picture_before 关系上。查询pic.before_pics 将返回之前图片的查询集。
  • 但是Uploadable 1 是“之前”的数据库中的信息在哪里? Uploadable 类只有三个记录,与此相关的检查类为零。

标签: django generic-foreign-key


【解决方案1】:

似乎只有一种方法可以做到这一点。您需要在通用模型中创建一个附加属性,以便您可以持久化上下文。

我明白了from this blog post:

class Uploadable(models.Model):
   
    # A hack to allow models have "multiple" image fields
    purpose = models.CharField(null=True, blank=True)
    
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

class Inspection(models.Model):
    ...
    images = GenericRelation(Uploadable, related_name='inspections')
    ...
    
    @property
    def picture_before(self):
        return self.images.filter(purpose='picture_after')
    
    @property
    def picture_after(self):
        return self.images.filter(purpose='picture_after')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2018-04-15
    • 1970-01-01
    相关资源
    最近更新 更多