Как я могу ограничить GenericForeignKey Django списком моделей?

Есть ли способ сообщить django, что модель, имеющая типы содержимого GenericForeignKey, может указывать только на модели из предопределенного списка? Например, у меня есть 4 модели: A, B, C, D и модель X, которая содержит GenericForeignKey. Могу ли я сказать X, что для GenericForeignKey разрешены только A и B?


person Geo    schedule 13.06.2011    source источник


Ответы (1)


Например, ваши приложения - это приложение и приложение2, в приложении есть модели A, B, а в приложении2 - модели C, D. вы хотите видеть только app.A, app.B и app2.C

from django.db import models

class TaggedItem(models.Model):
    tag = models.SlugField()
    limit = models.Q(app_label = 'app', model = 'a') | models.Q(app_label = 'app', model = 'b') | models.Q(app_label = 'app2', model = 'c')
    content_type = models.ForeignKey(ContentType, limit_choices_to = limit)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

используйте limit_choices_to на ForeignKey.

подробности и объекты Q, app_label, смотрите в документации django. вам нужно написать правильную app_label и модель. Это просто фрагмент кода

плюс: Думаю, вы неправильно написали app_label. Это может вам помочь.

from django.contrib.contenttypes.models import ContentType
for c in ContentType.objects.all():
    print(c.app_label, c.model)
person mumino    schedule 13.06.2011
comment
Но интерфейс администратора, похоже, не использует это, потому что это поле выбора. Это почему? - person Geo; 14.06.2011
comment
Я проверил его на стороне администратора, и он, как и ожидалось, работает с администратором по умолчанию. может быть, вы там допустили небольшую опечатку. Я не знаю твоей проблемы. - person mumino; 14.06.2011
comment
В моем админке, после того как я добавлю ваш лимит, варианты выбора GenericForeignKey исчезнут. Я остаюсь только с ---. Не могли бы вы опубликовать снимок экрана с выбором вашего администратора? - person Geo; 14.06.2011
comment
Я думаю, вы неправильно написали app_label или модель. app_label и модель должны быть в нижнем регистре. проверьте мой ответ, я добавил дополнительную информацию. - person mumino; 14.06.2011
comment
Ты прав. Я неправильно назвал модели. Возможно, вам стоит взглянуть на stackoverflow.com/questions/6335565/? - person Geo; 14.06.2011
comment
У меня работает на Django 2.2. Здесь важно отметить, что это ограничение / ограничение применяется только к раскрывающимся спискам / представлениям выбора администратора django, оно не применяет ограничения базы данных как таковые. Таким образом, вы можете назначать различные типы контента с помощью кода, несмотря на параметр limit_choices_to. Вы можете попробовать переопределить метод save для проверки типов содержимого на уровне кода. - person shad0w_wa1k3r; 11.09.2019
comment
Для ясности я бы не стал объединять предельную переменную со списком полей модели. Вероятно, он должен быть над списком с одной или двумя пустыми строками между ними. - person kloddant; 04.02.2020