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')

прочитайте также этот ответ и другие.

Вернуться на верх