Я использую трясогузку, и у меня есть две модели, которые имеют некоторые общие поля. Я хотел бы получить запрос на объединение этих общих полей. Вот модели:
class VideoPage(Page):
image = models.ForeignKey("wagtailimages.Image", blank=False, null=True, related_name="+", on_delete=models.SET_NULL)
vimeo_id = models.CharField(max_length=25)
publish_date = models.DateField(null=False, blank=False, default=datetime.date.today)
category_name = models.CharField(max_length=100, null=False, blank=True, default="Videos")
pdf = models.ForeignKey('wagtaildocs.Document', null=True, blank=False, default=1, on_delete=models.SET_NULL, related_name='+')
class CustomerHubFile(models.Model):
CASESTUDY = 'Case Study'
DATASHEET = 'Data Sheet'
SOLUTIONBRIEF = 'Solution Brief'
CATEGORY = [
(CASESTUDY, _('Case Study')),
(DATASHEET, _('Data Sheet')),
(SOLUTIONBRIEF, _('Solution Brief')),
]
title = models.CharField(max_length=255)
pdf = models.ForeignKey('wagtaildocs.Document', null=True, blank=False, on_delete=models.SET_NULL, related_name='+')
image = models.ForeignKey("wagtailimages.Image", blank=False, null=True, related_name="+", on_delete=models.SET_NULL, help_text="The image for the PDF")
publish_date = models.DateField(null=False, blank=False)
category_name = models.CharField(max_length=100, null=False, blank=True, choices=CATEGORY, default=CASESTUDY, verbose_name="Category")
Затем я пытаюсь добавить запрос, который объединяет обе эти модели вместе и возвращает его в контексте. Я не могу использовать values () или value_list (), потому что мне нужен доступ к моделям в шаблоне, чтобы использовать изображения. Я думаю, что я должен быть в состоянии сделать это, используя only () следующим образом:
pdfs = CustomerHubFile.objects.all().only('title', 'image', 'publish_date', 'category_name')
videos = VideoPage.objects.all().only('title', 'image', 'publish_date', 'category_name')
records = pdfs.union(videos).order_by('-publish_date')
context["records"] = records
return context
К сожалению, only () также получает идентификатор, но он не получает их в одинаковом порядке для обоих модели, которые портят JOIN, что приводит к ошибке, в которой говорится, что «типы UNION целочисленные и символьные не могут быть сопоставлены». Вот сгенерированный SQL:
(
SELECT "customer_hub_customerhubfile"."id",
"customer_hub_customerhubfile"."title",
"customer_hub_customerhubfile"."image_id",
"customer_hub_customerhubfile"."publish_date",
"customer_hub_customerhubfile"."category_name"
FROM "customer_hub_customerhubfile"
ORDER BY "customer_hub_customerhubfile"."publish_date" DESC
)
UNION (
SELECT "wagtailcore_page"."title",
"customer_hub_videopage"."page_ptr_id",
"customer_hub_videopage"."image_id",
"customer_hub_videopage"."publish_date",
"customer_hub_videopage"."category_name"
FROM "customer_hub_videopage"
INNER JOIN "wagtailcore_page"
ON ("customer_hub_videopage"."page_ptr_id" = "wagtailcore_page"."id")
ORDER BY "wagtailcore_page"."path" ASC
)
Я попытался указать поля id в only (), но он все равно не получает их в указанном порядке. Есть ли способ заставить идентификаторы возвращаться в качестве первого столбца для обоих запросов, или есть другой способ заставить этот союз работать?