Задать вопрос

Вывод данных в зависимости от is_active, Django-admin?

Имею две модели. Первая
class Currency(models.Model):

    # код валюты, пример UAH
    code = models.CharField(_('code'), max_length=3, unique=True)

    # название валюты, пример Украинская гривна
    name = models.CharField(_('name'), max_length=35, unique=True)

    # символ валюты, пример $
    symbol = models.CharField(_('symbol'), max_length=4, blank=True)

    # активность валюты
    is_active = models.BooleanField(_('active'), default=True, help_text=_('The currency will be available.'))


Вторая:

class Сourse(models.Model):
   
    # входящая валюта
    currency_from = models.ForeignKey(Currency, verbose_name=_('_from'), related_name="currency_from")

    # исходящая валюта
    currency_to = models.ForeignKey(Currency, verbose_name=_('_to'), related_name="currency_to")

    # по курсу 1 к:
    course = models.DecimalField(verbose_name=_('course'), max_digits=20, decimal_places=10,
                                 help_text="Курс по текущей паре")


В моделе Currency более 100 записей, но из них актывны только 5 (is_active), при заполнении второй модели в списках все записи с первой модели для выбора. Как ограничить выбор по актывным записям с первой моделе? Удалить из нее лишнее не вариант :)
  • Вопрос задан
  • 3383 просмотра
Подписаться 3 Оценить Комментировать
Решения вопроса 2
mututunus
@mututunus
Backend developer (Python, Golang)
Через форму:
class CourseForm(forms.ModelForm):
    currency_from = forms.ModelChoiceField(queryset=Currency.objects.filter(is_active=True))
Ответ написан
Для админки проще всего использовать formfield_for_foreignkey. Примерно так.

class CourseAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "currency":
            kwargs["queryset"] = Currency.objects.filter(is_active=True)
        return super(CourseAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
winordie
@winordie
Лучшая документация -- исходники
Можно свой менеджер создать
# First, define the Manager subclass.
class ActiveCurrency(models.Manager):
    def get_queryset(self):
        return super(ActiveCurrency, self).get_queryset().filter(is_active=True)


class Currency(models.Model):
    ...

    objects = models.Manager() # The default manager.
    active_currency = ActiveCurrency() # The Active-specific manager.

И тогда где надо использовать его вместо стандартного.
Currency.objects.all() == более 100 записей
Currency.active_currency.all() == 5
Ответ написан
Ваш ответ на вопрос

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

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