Встроенная модель Django "многие ко многим": администратор выбирает слишком много строк - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь заставить работать n-to-n rel таким образом, чтобы он отображал соответствующие отношения на странице администратора для каждой из двух моделей в этой версии.Из коробки только модель, для которой определены отношения, получает форму на своей странице администратора.Итак, я следовал официальной документации: https://docs.djangoproject.com/en/2.2/ref/contrib/admin/#inlinemodeladmin-objects Как вы должны видеть (ниже в моем коде), я в основном добавил именно то, что написано.Теперь моя проблема состоит в том, что у меня есть около 350 тыс. Строк в этой таблице сопоставления, но если я выберу в своей базе данных, у одного bar будет только 80 foos, а обратный выбор может быть 140. Теперь кажется, что он выбирает 147 тыс. Строк (!), поэтому кажется, что он каким-то образом выбирает примерно половину всей моей таблицы соединений, хотя я просто нажимаю на конкретную foo.Так что почему-то кажется, что это не просто объединение двух моделей с идентификаторами, когда я смотрю в своем журнале sql SQL, который он генерирует, просто выбирая вещи из одной таблицы за раз, что странно, потому что объединение можетбыть сделано в 1 строку.

Итак, у меня есть приложение Django, которое имеет следующие модели:

class Foo(models.Model):
    id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
    bars = models.ManyToManyField(Bar, related_name='foos')

bars не имеет отношения обратно к foos, которыйэто то, как работает n-to-n.

Теперь я хотел показать на /admin/bars/<id> все foos, которые у него есть в своей версии, а на /admin/bars/<id> я хотел показать всеbars что у него есть.Автоматически конечная точка foos работает «из коробки», потому что именно эту модель я определила для n-to-n rel, но для bars она требует немного больше работы.Поэтому я следовал официальному руководству, чтобы создать модель Inline в admin.py и заставить две модели администратора делиться этим Inline:

class FooBarInline(admin.StackedInline):
    model = Foo.bars.through
    extra = 1
class FooAdmin(admin.ModelAdmin):
    #... list_display, list_filter etc.
    inlines = (FooBarInline, )
    exclude = ('bars', )
class BarAdmin(admin.ModelAdmin):
    #... list_display, list_filter etc.
    inlines = (FooBarInline, )

Может кто-нибудь понять, почему он ведет себя такэтот?У меня нет круговых определений или чего-то еще, очень просто n-to-n rel tbh.Или, может быть, дайте мне несколько советов, как отлаживать SQL, генерируемый встроенной моделью?тогда я мог бы узнать это сам.

Большое вам спасибо!

...