Django:建模关系

时间:2013-09-30 23:34:44

标签: django model

在我的应用程序中,有一个模型" 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(第四种方式)这样的模型,但我已经确定这些对我来说不适用。

1 个答案:

答案 0 :(得分:2)

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

对于多对多关系,关于定义一个模型的模型不太清楚。 Django documentation说以下内容:

  

哪个模型具有ManyToManyField并不重要,但您应该这样做   只把它放在其中一个模型中 - 而不是两者。

     

通常,ManyToManyField实例应该放在对象中   将在表格上进行编辑。在上面的例子中,浇头是在   比萨(而不是Topping有比萨饼ManyToManyField)因为   想想比萨饼有馅料的披萨更自然   在多个比萨饼上打顶。它的设置方式就是披萨   表格会让用户选择浇头。