3

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')

エラーは次の原因で発生しますsyncdbAttributeError: 'ManyToManyField' object has no attribute 'ForeignKey'。モデルにとフィールドの両方を含めると、エラーが発生します。ManyToManyFieldForeign KeyStuff

これらの関係の両方を存在させる方法はありますか?アイデアをありがとう。

4

3 に答える 3

5

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)

このモデルでは、次のようなクエリを実行できます。

  • 「何のinformationためにstuff X?」
  • 「のためstuff Yに、何informationがリンクされていますか?」
  • 「私をすべて見つけstuffて」informationthing Z

さらに、それぞれに複数、それぞれに複数を持つことがinformationできstuffます。stuffthing

最初にこれらの質問を書き留めておくと、データベースに不要なリンクや関係がない正確なモデルを開発するのに役立ちます。

于 2012-07-11T04:31:09.277 に答える
0

私のバージョンの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の両方のを定義します。ManyToManyFieldForeignKey

information = models.ManyToManyField('Information', related_name='stuff_many_set')
stuff = models.ForeignKey('Stuff', related_name = 'info_set')

その後、syncdb幸せになります。もちろん、両方の関係が必要であることを確認する必要があります。ここでの一般的なエンティティ名では、混乱が生じる可能性があります。

于 2012-07-11T04:05:43.400 に答える
0

基本的に、次のようなエラーが発生します。

$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'.

なぜ?単純に、2つのテーブルが相互に参照している場合、ここでの問題は、逆ルックアップが適用されると、djangoが同じ名前を生成し、衝突が発生することです。

この問題を修正するには、エラー状態のように、related_namedjangoがさまざまなリバースコールを区別する方法を知っている方法を追加する必要があります。

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')

申し訳ありませんが、名前はあまりクリエイティブではありません。これでうまくいくはずです。

于 2012-07-11T04:15:05.153 に答える