vikkyshostak
@vikkyshostak
< This head full of dreams.

Django. Как исключить из FK поля инлайновой модели нужные значения?

Приветствую.

Django 2.0.3, Python 3.6.1.

Подскажите, пожалуйста, как исключить (сделать фильтр) из QuerySet поля инлайновой модели нужные значения?

Вот мой код:

# ./app/models.py

class Product(models.Model):
    name = models.CharField(max_length=255)

class Color(models.Model):
    name = models.CharField(max_length=255) # ['blue', 'red', 'yellow'] для примера

class Price(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    color = models.ForeignKey(Color, on_delete=models.CASCADE)
    price = models.PositiveSmallIntegerField()


# ./app/admin.py

class PriceInlineAdmin(admin.TabularInline):
    model = Price

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('id',)
    inlines = [
        PriceInlineAdmin
    ]

Собственно, как в инлайн-модели PriceInlineAdmin исключить из поля color (которое отображается, как select, ибо ForeignKey) запись со значением blue?

Буду рад толковым советам.
Заранее спасибо!
  • Вопрос задан
  • 347 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Из документации:
class PriceInlineAdmin(admin.TabularInline):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'color':
            kwargs['queryset'] = Color.objects.all().exclude(name='blue')
        return super().formfield_for_foreignkey(db_field, request, **kwargs)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
В класс PriceInlineAdmin добавь форму.
В классе формы:
def __init__(self, *args, **kwargs):
  super(PriceForm, self).__init__(*args, **kwargs)
  self.fields['color'].queryset = Color.objects.filter(~Q(name="blue"))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы