Как разделить объекты в Django Admin?

#python #django

#python #django

Вопрос:

У меня есть приложение под названием «Продукт» со следующим models.py:

 class Product(models.Model):
    product_id = models.CharField(max_length=50)
    pub_date = models.DateTimeField(default=datetime.now)
    title = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    featured = models.BooleanField(default=False)
  

Я хочу иметь два отдельных раздела в Django Admin: Продукты и рекомендуемые продукты, в зависимости от того, featured = True или False .
Итак, по умолчанию все продукты перечислены в разделе «Продукты«. Но если featured = True они будут перемещены в раздел Рекомендуемые продукты. Можете ли вы, пожалуйста, помочь мне, как это сделать? Заранее спасибо.

Ответ №1:

Три шага:

  1. Напишите прокси-модель для модели Product .
  2. Измените менеджер по умолчанию, чтобы возвращать только рекомендуемые продукты.
  3. Зарегистрируйте свою прокси-модель в admin, как и любую другую модель.

Подробнее об этом можно прочитать здесь: Использование прокси-моделей для настройки Django Admin

Комментарии:

1. Большое спасибо за помощь! Есть ли способ «удалить» продукт из раздела » Продукты » после того, как он был перемещен в » Рекомендуемые продукты «?

2. Да, прочитайте о методе ModelAdmin.get_queryset и отфильтруйте там продукты, которые вы хотите показать. docs.djangoproject.com/en/2.2/ref/contrib/admin /…

Ответ №2:

Есть несколько способов сделать это. Возможно, самым простым является создание представления базы данных, а затем его инкапсуляция с использованием модели django. Вы можете создать подобное представление в своей консоли базы данных:

 CREATE VIEW view_name AS
  SELECT columns
  FROM tables
  [WHERE conditions];
  

Как только вы это сделаете, вы можете ссылаться на представление в django следующим образом:

 
class FeaturedProduct(modes.Model):
    attr1 = models.CharField()

    class Meta:
        managed = False
        db_table = '<name of your view here>'

  

Убедитесь, что managed установлено значение False . Вот соответствующая документация для этого. Вы хотите сделать это, потому что django не создает эту модель для вас, а скорее вы создаете ее сами.

Другим способом сделать это было бы создать пользовательский Manager . Эти менеджеры позволяют вам изменять objects атрибут вашей модели, позволяя вам устанавливать набор запросов, который вы хотите. Я думаю, вы хотели бы взглянуть на документацию менеджера, и вы можете взглянуть на определение пользовательских наборов запросов для ваших объектов.