Django связанная модель не обновляет связанный объект в админке - PullRequest
7 голосов
/ 18 апреля 2020

У меня есть 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, соответствующая сделка не появится. Есть что-то, к чему я не подключаюсь?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Да, если вы используете models.manytoMany (), вы должны поместить его только в одну модель. нет двух

Но есть очень хороший атрибут, который вы должны использовать: - со сквозным атрибутом вы можете создать промежуточную модель. вот пример:

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 голосов
/ 06 мая 2020

Я только что проверил это, и вы действительно были очень близки.

Первый , @ 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]
0 голосов
/ 21 апреля 2020

Достаточно, чтобы отношение определялось только в одной модели. В противном случае у вас будет две отдельные таблицы для отдельного отношения ManyToMany: ClientDeal и DealClient.

Вам нужно только выбрать, какую из них оставить. И, возможно, обновите админские строки в соответствии с Django Документация администратора

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


class Deal(models.Model):
    pass
...