次のような2つのモデルがあります。
models.py
class Client(models.Model):
deal = models.ManyToManyField('Deal', related_name="clients")
class Deal(models.Model):
client = models.ManyToManyField(Client, related_name="deals")
次に、管理者で、関連するモデルをインライン化して、開いているオブジェクトタイプに関係なく変更を簡単に行えるようにしました。
admin.py
class ClientInline(admin.TabularInline):
model = Deal.client.through
class DealAdmin(admin.ModelAdmin):
inlines = [ClientInline]
class DealInline(admin.TabularInline):
model = Client.deal.through
class ClientAdmin(admin.ModelAdmin):
inlines = [DealInline]
ただし、Client
をDeal
に追加してからClient
詳細ページを開くと、対応する取引が表示されません。接続していないものはありますか?
私はこれをテストしました、あなたは実際に本当に近かったです。
最初、 @ wowkin2 は、両方のモデルでManyToManyField
を定義したくないので、私はおそらくあなたのDeal
モデルでそれを定義するでしょう。
2番目、これを置き換えます:
class DealInline(admin.TabularInline):
model = Client.deal.through
これとともに:
class DealInline(admin.TabularInline):
model = Deal.client.through
そして、すべてが機能するはずです。
つまり、ファイルは次のようになります。
models.py
class Deal(models.Model):
client = models.ManyToManyField(Client, related_name="deals")
admin.py
class ClientInline(admin.TabularInline):
model = Deal.client.through
class DealAdmin(admin.ModelAdmin):
inlines = [ClientInline]
class DealInline(admin.TabularInline):
model = Deal.client.through
class ClientAdmin(admin.ModelAdmin):
inlines = [DealInline]
1つのモデルでのみ関係を定義するだけで十分です。それ以外の場合は、ManyToManyリレーションごとにClientDealとDealClientの2つのテーブルが作成されます。
あなたがする必要があるのは、あなたが去る必要があるものを選ぶことです。そしておそらく Django管理ドキュメント に従って管理インラインを更新します
class Client(models.Model):
deals = models.ManyToManyField('Deal', related_name="clients")
class Deal(models.Model):
pass
はい、models.manytoMany()を使用している場合は、1つのモデルにのみ配置する必要があります。 2つはありません
ただし、使用すべき非常に優れた属性があります。through through属性を使用すると、中間モデルを作成できます。ここに例があります:
from Django.db import models
class Person(models.Model):
name = models.CharField(max_length=200)
groups = models.ManyToManyField('Group', through='GroupMember', related_name='people')
class Meta:
ordering = ['name']
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=200)
class Meta:
ordering = ['name']
def __unicode__(self):
return self.name
class GroupMember(models.Model):
person = models.ForeignKey(Person, related_name='membership')
group = models.ForeignKey(Group, related_name='membership')
type = models.CharField(max_length=100)
def __unicode__(self):
return "%s is in group %s (as %s)" % (self.person, self.group, self.type))
後で、インライン管理クラスを使用できます!