在我的应用程序中,有一个模型" Image"和图像可以关联的几个模型(事件,地点,成员)。我正在考虑两种建模图像关系的方法。第一个是在Image中为每个相关模型放置关系字段(该字段将是ForeignKey或ManyToManyField)。第二种方式是放置字段"图像"每个可以有相关图像的模型(在某些模型的情况下,它只是一个图像)。更推荐哪种方式?
# the first way
class Member(models.Model):
name = models.CharField('name', max_length=128)
class Event(models.Model):
name = models.CharField('name', max_length=128)
class Place(models.Model):
name = models.CharField('name', max_length=128)
class Image(models.Model):
title = models.CharField('title', max_length=128)
members = models.ManyToManyField(Member)
place = models.ForeignKey(Place)
event = models.ForeignKey(Event)
# the second way
class Image(models.Model):
title = models.CharField('title', max_length=128)
class Member(models.Model):
name = models.CharField('name', max_length=128)
images = models.ManyToManyField(Image)
class Event(models.Model):
name = models.CharField('name', max_length=128)
images = models.ManyToManyField(Image)
class Place(models.Model):
name = models.CharField('name', max_length=128)
images = models.ManyToManyField(Image)
我也可以使用泛型关系(第三种方式)或者我可以制作像EventImage,PlaceImage,MemberImage(第四种方式)这样的模型,但我已经确定这些对我来说不适用。
答案 0 :(得分:2)
如果你的关系是多对一的,那么正确的建模方式是使用ForeignKey。
对于多对多关系,关于定义一个模型的模型不太清楚。 Django documentation说以下内容:
哪个模型具有ManyToManyField并不重要,但您应该这样做 只把它放在其中一个模型中 - 而不是两者。
通常,ManyToManyField实例应该放在对象中 将在表格上进行编辑。在上面的例子中,浇头是在 比萨(而不是Topping有比萨饼ManyToManyField)因为 想想比萨饼有馅料的披萨更自然 在多个比萨饼上打顶。它的设置方式就是披萨 表格会让用户选择浇头。