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]
我有 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]