我的项目中有几个带有通用外键的模型,用于为这些模型定义图像:
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 framework
,m2m
与中间表的链接会更好。