Я пытаюсь заставить работать 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, генерируемый встроенной моделью?тогда я мог бы узнать это сам.
Большое вам спасибо!