Django 相关模型不更新管理中的相关对象

Django related model not updating related object in admin

我有 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详情页面,则不会出现相应的交易。有什么我没有连接的吗?

只在一个模型中定义关系就足够了。否则,对于单独的 ManyToMany 关系,您将有 2 个单独的表:ClientDeal 和 DealClient。

您需要做的就是选择您要离开的那个。并可能根据 Django Admin documentation

更新管理员内联
class Client(models.Model):
    deals = models.ManyToManyField('Deal', related_name="clients")


class Deal(models.Model):
    pass

是的,如果您使用的是 models.manytoMany() ,则必须只将它放在一个模型中。没有两个

但是您应该使用一个非常好的属性: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))

稍后,您可以使用内联管理员 class!

我刚刚对此进行了测试,您实际上非常接近。

首先, @wowkin2 说,你不想在两个模型中定义一个 ManyToManyField 所以我可能只是在你的 Deal 型号.

第二个,替换为:

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]