web-dev-qa-db-ja.com

Django関連モデルが管理者の関連オブジェクトを更新しない

次のような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]

ただし、ClientDealに追加してからClient詳細ページを開くと、対応する取引が表示されません。接続していないものはありますか?

7
Ryan

私はこれをテストしました、あなたは実際に本当に近かったです。

最初@ 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
John R Perry

1つのモデルでのみ関係を定義するだけで十分です。それ以外の場合は、ManyToManyリレーションごとにClientDealとDealClientの2つのテーブルが作成されます。

あなたがする必要があるのは、あなたが去る必要があるものを選ぶことです。そしておそらく Django管理ドキュメント に従って管理インラインを更新します

class Client(models.Model):
    deals = models.ManyToManyField('Deal', related_name="clients")


class Deal(models.Model):
    pass
0
wowkin2

はい、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))

後で、インライン管理クラスを使用できます!

0