【问题标题】:How can I join two child tables using Django Querset API?如何使用 Django Queryset API 连接两个子表?
【发布时间】:2020-07-13 21:37:16
【问题描述】:

我有一个包含两个子表和一个父表的模型。这是示例模型类。

# Stores list of unique category names
class Category(models.Model):
    category = models.CharField(max_length=20, unique=True, validators=[MinLengthValidator(limit_value=5)])
    name = models.CharField(max_length=20, validators=[MinLengthValidator(limit_value=8)])

# Parent class for the next two child classes
class DailyLog(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=100, validators=[MinLengthValidator(limit_value=8)])
    code = models.CharField(max_length=4, validators=[MinLengthValidator(limit_value=3)])
    suggested_values = models.CharField(max_length=100, null=True, blank=True)

# First child class defines display order for dailylog items
class DailyLogDisplayOrder(models.Model):
    category_item = models.ForeignKey(DailyLog, on_delete=models.CASCADE)
    display_order = models.PositiveIntegerField()

# Second Child class publishes dailylog on a daily bases
class DailyLogCheckList(models.Model):
    daily_task = models.ForeignKey(DailyLog, on_delete=models.CASCADE)
    publish_date = models.DateField(auto_now=True)

    daily_task = DailyTaskCategoryManager() # Log manager to get records per category

如何执行笛卡尔积查询?最后一列来自第一个子表 Dailylogdisplayorder。这是原始的 sql。

select daily_task_id, checklist.publish_date, disporder.display_order
from dailylogchecklist checklist, compliance_dailylogdisplayorder disporder
where checklist.daily_task_id = disporder.category_item_id and checklist.publish_date='2020-07-12'

我已尝试根据 Django 文档使用 cursor.execute() 方法。但是,我无法弄清楚如何在 QuerySet 中返回结果。并且还在寻找一种更好的方法来使用 QuerySet 组合子列。返回的查询集被分配给一个表单集。

class DailyTaskCategoryManager(models.Manager):
def with_displayorder(self, user):
     from django.db import connection
     dtrange = datetime.today().date()
     with connection.cursor() as cursor:
     cursor.execute("select daily_task_id, checklist.publish_date, disporder.display_order
                     from dailylogchecklist checklist, compliance_dailylogdisplayorder disporder
                     where checklist.daily_task_id = disporder.category_item_id and 
                     checklist.publish_date=%s", [dtrange])
            result_list = []
            for row in cursor.fetchall():
                p = self.model(id=row[0], daily_task_id=row[1], publish_date=row[2])
                p.display_order = row[3]
                result_list.append(p)
            return result_list

【问题讨论】:

    标签: python-3.x django django-models


    【解决方案1】:

    我已经回答了一个类似的问题,您可以使用prefetch_related() 来获取相关的子表数据。检查这个答案

    https://stackoverflow.com/a/71571509/9561654

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-07
      • 2011-08-03
      • 2020-12-27
      • 2018-11-08
      • 2010-11-12
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多