2013-09-30 88 views
0

在我的應用程序中,有一個模型「圖像」和圖像可以涉及的幾個模型(Event,Place,Member)。我正在考慮兩種建模圖像關係的方法。第一個是將關係字段放在Image中,用於每個相關模型(字段將是ForeignKey或ManyToManyField)。第二種方法是將字段「圖像」放到每個可以具有相關圖像的模型上(如果某些模型只有一個圖像)。哪種方式更受推薦?Django:建模關係

# 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(第四方式),但我已經決定這不會爲我工作那麼好。

回答

2

如果您的關係是多對一,那麼建模它的正確方法是使用ForeignKey

對於多對多的關係,不清楚在哪個模型上定義一個關係。 Django documentation說以下內容:

不要緊哪個模型有ManyToManyField,但你應該 只把它放在車型之一 - 不能同時使用。

通常情況下,ManyToManyField實例應該放入要在窗體上編輯的對象 。在上面的例子中,澆頭位於 比薩(而不是Topping有一個比薩餅ManyToManyField),因爲 想想比薩比配比比較多的比爾餅要多。上面的設置方式,Pizza 表單可以讓用戶選擇澆頭。