0

在我的应用程序中,有一个模型“图像”和几个图像可以关联的模型(事件、地点、成员)。我正在考虑两种建模图像关系的方法。第一个是将每个相关模型的关系字段放在 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 之类的模型(第四种方式),但我已经决定这些对我来说不太适用。

4

1 回答 1

2

如果您的关系是多对一的,那么建模它的正确方法是使用ForeignKey

对于多对多关系,定义哪个模型不太清楚。Django 文档说明如下:

哪个模型具有 ManyToManyField 无关紧要,但您应该只将它放在其中一个模型中——而不是两者。

通常,ManyToManyField 实例应该放在要在表单上编辑的对象中。在上面的示例中,toppings 在 Pizza 中(而不是 Topping 有一个 Pizzas ManyToManyField ),因为认为一个有配料的披萨比一个配料存在多个披萨上更自然。按照上面的设置方式,Pizza 表单将允许用户选择浇头。

于 2013-10-01T00:39:07.533 回答