GenericRelation的两个不同字段在一个模型中

时间:2016-08-03 17:24:46

标签: django django-models django-orm

我的项目中有几个带有通用外键的模型,用于为这些模型定义图像:

class GenericImage(models.Model):

    image = ImageField(
    )
    content_type = models.ForeignKey(
        ContentType,
        on_delete=models.CASCADE,
        blank=True,
        null=True
    )
    object_id = models.PositiveIntegerField(
        blank=True,
        null=True
    )
    content_object = GenericForeignKey(
        'content_type',
        'object_id'
    )

我想提供两个与此模型不同的链接,一个用于主图像GenericRelation,另一个用于其他图像GenericRelation

class MyModel(models.Model):

    images = GenericRelation(
        GenericImage,
    )
    main_image = GenericRelation(
        GenericImage,
    )

首先想到的是将布尔字段main_image添加到GenericImage模型并覆盖clean方法:

class GenericImage(models.Model):
    ...

    main_image = models.BooleanField(
    default=False
    )

def clean(self):
    obj = self.content_object
    if self.main_image and obj:
        if obj.images.filter(main_image=True).exists():
            raise ValidationError('main image must be unique!')

但它将验证逻辑与主模型分开,每当我想要更改main_image时,我都必须更改该布尔字段。
我的问题是否有任何优雅的解决方案,或者根本不需要ContentType frameworkm2m与中间表的链接会更好。

0 个答案:

没有答案