Django: Для объединения и получения строк из различных моделей
1.У нас есть две похожие модели, и Я хотел бы иметь возможность получать их одновременно и сортировать по дате и времени публикации и т.д. Возможно ли это?
2.Или оба избыточных поля должны быть объединены в одну модель?
# 1.
class Model1(models.Model):
title = ...
thumbnail = ...
description = ...
...
class Model2(models.Model):
title = ...
image_url = ...
product_id = ...
reivew = ...
# 2. Combine into one model
class Model(models.Model)
title = ...
thumbnail = ...
description = ...
image_url = ...
product_id = ...
reivew = ...
Вы можете объединить() две модели без общих родителей, а затем упорядочить_by() некоторые столбец.
"Рассмотрим этот ответ от новичка"
Если вы просто хотите получить некоторые объекты model1 и model2 с помощью одного оператора запроса, возможно, будет хорошо наследовать две модели от базовой модели, как это:
в вашей models.py:
class Base(models.Model):
title = ...
created_at = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(user)
class Meta:
ordering = ['-created_at']
# inherits fields of Base model
class Model1(Base):
field = ...
# fields
class Model2(Base):
# fields
используя этот метод, заполните необходимые поля модели `Base' следующим образом:
>>> m1 = Model1(field="value", title=..., owner=UserObject,...).save()
# for get objects do normal:
>>> objects = Base.objects.filter(owner=user)
# the result is list of users `Model1' or 'Model2` created objects
Также вы можете использовать django-model-utils и получить Base объекты по типу дочерних. Это будет выглядеть следующим образом:
from model_utils.managers import InheritanceManager
class Base(models.Model):
# like previous version
# just remember modify objects
objects = InheritanceManager()
# inherits fields of Base model
class Model1(Base):
class Model2(Base):
получить объекты:
>>> Base.objects.all().select_related('Model1', 'Model2')
прочитайте также этот ответ и другие.