#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:
Три шага:
- Напишите прокси-модель для модели
Product
. - Измените менеджер по умолчанию, чтобы возвращать только рекомендуемые продукты.
- Зарегистрируйте свою прокси-модель в 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
атрибут вашей модели, позволяя вам устанавливать набор запросов, который вы хотите. Я думаю, вы хотели бы взглянуть на документацию менеджера, и вы можете взглянуть на определение пользовательских наборов запросов для ваших объектов.