Как я могу объединить две дочерние таблицы с помощью Django Querset API? - PullRequest
1 голос
/ 14 июля 2020

У меня есть модель с двумя дочерними таблицами и одной родительской таблицей. Вот образцы классов моделей.

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

Я пробовал использовать метод cursor.execute () в документации Django. Однако я не могу понять, как вернуть результаты в QuyerySet. А также ищем лучший способ объединить дочерние столбцы с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...