[英]Django Models ManyToMany and Foreign Key
試圖更好地處理如何處理django數據庫關系。 任何想法都表示贊賞。
考慮以下示例模型:
class Things(models.Model):
name = models.CharField(max_length=20)
class Stuff(models.Model):
name = models.CharField(max_length=20)
information = models.ManyToManyField('Information')
things = models.ForeignKey('Things')
class Information(models.Model):
name = models.CharField(max_length=20)
stuff = models.ForeignKey('Stuff')
syncdb
導致錯誤: AttributeError: 'ManyToManyField' object has no attribute 'ForeignKey'
。 錯誤的結果,如果我同時包括ManyToManyField
和Foreign Key
在田里Stuff
模型。
有沒有辦法可以讓這兩種關系存在? 謝謝你的任何想法。
如果你想知道有多少information
鏈接到每個stuff
,django將提供一個默認的管理器 ,讓你倒退; 為此,你不需要一個外鍵stuff
。
class Things(models.Model):
name = models.CharField(max_length=20)
class Stuff(models.Model):
name = models.CharField(max_length=20)
information = models.ManyToManyField('Information')
things = models.ForeignKey('Things')
class Information(models.Model):
name = models.CharField(max_length=20)
此模型將允許您執行以下查詢:
X
的stuff
什么information
?” stuff
Y
,鏈接了什么information
?” stuff
和information
的thing
Z
” 此外,它可以讓你有多個information
的每個stuff
,多stuff
對每個thing
。
在開始時寫下這些問題將有助於您開發准確的模型,而無需在數據庫中建立不必要的鏈接/關系。
我的django版本提供了更多信息:
Error: One or more models did not validate:
foo.stuff: Reverse query name for m2m field 'information' clashes with field 'Information.stuff'. Add a related_name argument to the definition for 'information'.
foo.information: Reverse query name for field 'stuff' clashes with m2m field 'Stuff.information'. Add a related_name argument to the definition for 'stuff'.
這可能足以讓你前進。 定義related_name
同時為ManyToManyField
關系和ForeignKey
從信息到東西的關系...
information = models.ManyToManyField('Information', related_name='stuff_many_set')
stuff = models.ForeignKey('Stuff', related_name = 'info_set')
然后syncdb
會很高興。 當然,你應該確定你需要兩種關系。 使用通用實體名稱,看起來可能存在一些混淆。
從根本上說,你會得到這樣的錯誤:
$python manage.py syncdb
Error: One or more models did not validate:
t.stuff: Reverse query name for m2m field 'information' clashes with field 'Information.stuff'. Add a related_name argument to the definition for 'information'.
t.information: Reverse query name for field 'stuff' clashes with m2m field 'Stuff.information'. Add a related_name argument to the definition for 'stuff'.
為什么? 很簡單,你有兩個相互引用的表,這里的問題是,當應用反向查找時,django將生成相同的名稱,創建一個沖突。
要解決此問題,如錯誤狀態,您需要以這種方式添加related_name
django知道如何區分不同的反向調用。
from django.db import models
class Things(models.Model):
name = models.CharField(max_length=20)
class Stuff(models.Model):
name = models.CharField(max_length=20)
information = models.ManyToManyField('Information', related_name = 'information_information')
things = models.ForeignKey('Things')
class Information(models.Model):
name = models.CharField(max_length=20)
stuff = models.ForeignKey('Stuff', related_name = 'information_stuff')
對不起,我的名字不是很有創意,這應該有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.