Фильтровать результаты поля «один на один» в Django Admin - PullRequest
0 голосов
/ 15 ноября 2018

Прежде всего, вот модель, которую я пытаюсь ограничить:

Класс вопроса:

class Question(models.Model):
title = models.CharField(
    max_length = 200,
    verbose_name = "Question title")
description = models.TextField(
    verbose_name = "Question description")
block = models.ForeignKey(
    to=Block,
    null=True,
    on_delete=models.SET_NULL,
    verbose_name='Subject part to which this question belongs')
timestamp = models.DateTimeField(
    auto_now_add=True,
    verbose_name='Date at which the question was added')

Класс плаката, который содержит поле «Один к одному» на вопрос, который я хочу ограничить:

class Poster(models.Model):
title = models.CharField(
    max_length = 200,
    verbose_name = "The poster's title")
description = models.TextField(
    verbose_name = "The poster's description")
authors = models.CharField(
    max_length = 200,
    verbose_name = "Authors' names")
image = models.ImageField(
    upload_to = 'images',
    verbose_name = 'Poster image')
block = models.ForeignKey(
    to = Block,
    null = True,
    on_delete = models.SET_NULL,
    verbose_name = 'The subject part to which the poster belongs')
associated_question = models.OneToOneField(
    Question,
    null=True,
    blank=True,
    on_delete=models.SET_NULL,
    unique=True,
    verbose_name='Question associated to this poster')

То, что я пытаюсь сделать, - это ограничить параметры, отображаемые в поле «related_question» в админке. Под этим я подразумеваю, что если, например, я просто хотел показать в админе вопросы, у которых была отметка времени сверх определенного лимита, как бы я это сделал?

Большое спасибо заранее. Если я пропустил что-то, что необходимо, чтобы понять мой вопрос, пожалуйста, спросите меня об этом. Я буду рад предоставить больше информации, если это необходимо.

1 Ответ

0 голосов
/ 15 ноября 2018

Если вы хотите ограничить список в admin по умолчанию, вы можете переопределить get_queryset и отфильтровать набор запросов, например:

РЕДАКТИРОВАТЬ: для фильтрации associated_question поле формы раскрывающегося списка вы можете использовать formfield_for_foreignkey

class PosterAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super(PosterAdmin, self).get_queryset(request)
        timestamp_limit = datetime.now() - datetime.timedelta(minutes=5)
        return qs.filter(associated_question__timestamp__gt=timestamp_limit)

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field.name == "associated_question":
            timestamp_limit = datetime.now() - datetime.timedelta(minutes=5)
            kwargs["queryset"] = Question.objects.filter(timestamp__gt=timestamp_limit)
        return super(PosterAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Список ограниченных вопросов

class QuestionAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super(QuestionAdmin, self).get_queryset(request)
        timestamp_limit = datetime.now() - datetime.timedelta(minutes=5)
        return qs.filter(timestamp__gt=timestamp_limit)
...