簡體   English   中英

Django模型ManyToMany和外鍵

[英]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' 錯誤的結果,如果我同時包括ManyToManyFieldForeign 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)

此模型將允許您執行以下查詢:

  • Xstuff什么information ?”
  • “對於stuff Y ,鏈接了什么information ?”
  • “查找我的所有stuffinformationthing 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM