Администратор Django, многие ко многим, сохранение и извлечение из БД - PullRequest
0 голосов
/ 09 июля 2019

У меня довольно простые отношения между двумя моделями: Person и городами, которые посетил человек (City).

class Person(models.Model):
    ...
    cities = models.ManyToManyField(City)

Я пишу страницу администратора для этого, и у меня есть отдельный класс формы для Person, который вообще не упоминает города, и у меня есть класс, унаследованный от admin.ModelAdmin, которыйделает.

Мне нужно вызвать функцию, передав полностью сохраненный экземпляр Person, все поля должным образом обновлены и сохранены в БД, включая города.Однако, какой бы из методов save... я переопределил, я могу получить экземпляр Person для сохранения и прочитать новые значения из БД, однако я не могу получить обновленные города из БД.Те, что я пробовал, это save_m2m и _save_m2m в форме, save_form, save_related в ModelAdmin.В каждом из этих мест я звоню super().<the method> и затем проверяю person.cities.all().Каждый раз, когда я получаю старое значение (то, которое было в БД до обновления, а не новое значение из формы).

Есть ли место, в которое я могу нажать, чтобы получить фактическое сохраненное и зафиксированноезначение поля «многие ко многим»?Есть ли способ обернуть что-нибудь в transaction.atomic или что-нибудь в этом роде?Или я делаю это совершенно неправильно?

1 Ответ

0 голосов
/ 09 июля 2019

Пока что я в итоге переопределил метод changeform_view:

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    result = super().changeform_view(request, object_id, form_url, extra_context)
    if request.method == 'POST':
        bundle = Person.objects.prefetch_related('cities').get(pk=object_id)
        notify_search(bundle)

    return result

Не уверен, что это лучшее решение. Я буду рад принять чье-либо решение, если оно будет лучше.

...