Проблемы с получением запроса на объединение для разных моделей в Wagtail - PullRequest
0 голосов
/ 18 февраля 2020

Я использую трясогузку, и у меня есть две модели, которые имеют некоторые общие поля. Я хотел бы получить запрос на объединение этих общих полей. Вот модели:

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 (), но он все равно не получает их в указанном порядке. Есть ли способ заставить идентификаторы возвращаться в качестве первого столбца для обоих запросов, или есть другой способ заставить этот союз работать?

...