7. Как создать общую модель, которая может быть связана с любым типом сущности? (Например, категория или комментарий?).¶
У вас есть такие модели.
class Category(models.Model):
name = models.CharField(max_length=100)
# ...
class Meta:
verbose_name_plural = "Categories"
class Hero(models.Model):
name = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# ...
class Villain(models.Model):
name = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# ...
Category
может применяться как генеральная модель. Вы, вероятно, хотите иметь возможность применять категории к объектам любого класса модели. Вы можете сделать это следующим образом
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
# ...
class FlexCategory(models.Model):
name = models.SlugField()
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Hero(models.Model):
name = models.CharField(max_length=100)
flex_category = GenericRelation(FlexCategory, related_query_name='flex_category')
# ...
class Villain(models.Model):
name = models.CharField(max_length=100)
flex_category = GenericRelation(FlexCategory, related_query_name='flex_category')
# ...
Что мы сделали, мы добавили поля GenericForeignKey
на FlexCategory
, используя одно ForeignKey
и одно PositiveIntegerField
, затем добавили GenericRelation
на модели, которые вы хотите классифицировать.
На уровне базы данных это выглядит следующим образом:
Вы можете классифицировать Hero
следующим образом.
FlexCategory.objects.create(content_object=hero, name="mythic")
И затем получить Hero
, классифицированный как «призрак», например, так
FlexCategory.objects.create(content_object=hero, name="ghost")
Это дает нам следующее sql.
SELECT "entities_hero"."name"
FROM "entities_hero"
INNER JOIN "entities_flexcategory" ON ("entities_hero"."id" = "entities_flexcategory"."object_id"
AND ("entities_flexcategory"."content_type_id" = 8))
WHERE "entities_flexcategory"."name" = ghost
Рецепты Django ORM 2.0
Содержание
- 1. Как найти запрос, связанный с набором запросов?
- 2. Как делать OR-запросы в Django ORM?
- 3. Как делать AND-запросы в Django ORM?
- 4. Как сделать NOT запрос в Django queryset?
- 5. Как выполнить объединение двух наборов запросов из одной или разных моделей?
- 6. Как выбрать только некоторые поля в наборе запросов?
- 7. Как сделать подзапросное выражение в Django?
- 8. Как отфильтровать набор запросов с критериями на основе сравнения значений их полей
- 9. Как отфильтровать поле FileField без какого-либо файла?
- 10. Как выполнять операции объединения в django ORM?
- 11. Как найти вторую по величине запись с помощью Django ORM?
- 12. Найти строки с дублирующимися значениями полей
- 13. Как найти значения разных полей из набора запросов?
- 14. Как использовать объекты
Q
для сложных запросов? - 15. Как группировать записи в Django ORM?
- 16. Как эффективно выбрать случайный объект из модели?
- 17. Как использовать произвольные функции базы данных в кверисетах?
- 1. Как создать несколько объектов в одном запросе?
- 2. Как скопировать или клонировать существующий объект модели?
- 3. Как сделать так, чтобы можно было создать только один объект?
- 4. Как обновить денормализованные поля в других моделях при сохранении?
- 5. Как выполнить операцию truncate like с помощью Django ORM?
- 6. Какие сигналы подает Django во время создания или обновления объекта?
- 7. Как преобразовать строку в дату и сохранить в базе данных?
- 1. Как упорядочить набор запросов по возрастанию или убыванию?
- 2. Как упорядочить набор запросов без учета регистра?
- 3. Как сделать сортировку по двум полям
- 4. Как сделать сортировку по полю из связанной модели (с внешним ключом)?
- 5. Как сделать сортировку по аннотированному (вычисляемому) полю?
- 1. Как моделировать отношения один на один?
- 2. Как смоделировать отношения «один ко многим»?
- 3. Как смоделировать отношения «многие ко многим»?
- 4. Как включить самоссылающийся ключ ForeignKey в модель
- 5. Как преобразовать существующие базы данных в модели Django?
- 6. Как добавить модель для представления базы данных?
- 7. Как создать общую модель, которая может быть связана с любым типом сущности? (Например, категория или комментарий?).
- 8. Как указать имя таблицы для модели?
- 9. Как указать имя столбца для поля модели?
- 10. В чем разница между
null=True
иblank=True
? - 11. Как использовать UUID вместо ID в качестве первичного ключа?
- 12. Как использовать поле slug в django для большей читабельности?
- 13. Как добавить несколько баз данных в приложение django?
- 1. Как убедитьтся, что функция использовала фиксированное количество запросов?
- 2. Как ускорить тестирование путем повторного использования базы данных между прогонами теста?
- 3. Как перезагрузить объект модели из базы данных?
Дополнительно
Вы здесь:
-
Документация Django Рецепты Django ORM 2.0
- 7. Как создать общую модель, которая может быть связана с любым типом сущности? (Например, категория или комментарий?).