Django ORM, соединение родителя и ребенка

Django ORM

Всем доброго дня,

Надеемся, что у всех все хорошо.

У меня есть две таблицы, которые я хочу объединить и пытаюсь объединить определенным образом.

Я мог бы легко соединить их с помощью SQL, но скорее я хотел бы сделать это с помощью Django.

Модели ниже;

Child:

    class employee(models.Model):
    client = models.ForeignKey(client, on_delete=models.CASCADE)
    mySharePlan_ID = models.CharField(max_length=10, unique=True)
    payroll_ID = models.CharField(max_length=100)
    first_name = models.CharField(max_length=155,)
    middle_name = models.CharField(max_length=155,null=True, blank=True)
    last_name = models.CharField(max_length=155)
    TFN = models.IntegerField(null=True,blank=True)
    subsidary = models.CharField(max_length=155,null=True, blank=True)
    divison = models.CharField(max_length=155,null=True, blank=True)
    job_title = models.CharField(max_length=155,null=True, blank=True)
    tax_rate = models.FloatField(null=True,blank=True)
    hire_date = models.DateField(null=True,blank=True)
    terminiaton_date = models.DateField(null=True,blank=True)
    termination_reason = models.CharField(max_length=155, blank=True)
    rehire_date = models.DateField(null=True,blank=True)
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.DO_NOTHING)
    class Meta:
        unique_together = ('client', 'payroll_ID',)

    def __str__(self):
        full_name = "Payroll ID: " + self.payroll_ID + ", " + self.first_name + " " + self.last_name
        return full_name

Parent:

    class offer_eligibility(models.Model): 
    offer = models.ForeignKey(offer,on_delete=models.CASCADE)
    employee = models.ForeignKey(employee,on_delete=models.CASCADE)
    amount_offered = models.PositiveBigIntegerField()
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.DO_NOTHING)

У каждого работника может быть много предложений.

Я пытаюсь создать представление, которое показывает список сотрудников, которые находятся в выбранном предложении и если у них есть какая-либо сумма_предложения.

Для этого мне нужно сначала отфильтровать offer_eligibility по предложению, у меня есть такой набор запросов.

Я хочу добавить этот набор запросов к набору запросов сотрудников (фильтруется по клиенту, достаточно легко фильтруется) и там, где сотрудник не существует в наборе запросов, я хочу, чтобы amount_offered было None/null.

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

Любая помощь будет высоко оценена.

Заранее спасибо, Том

Я понял! После целого дня попыток разобраться с этим.

Я чувствую, что теперь гораздо лучше понимаю, как Django пишет SQL.

Фильтрация кверисета модели

def get_queryset(self): #Filter queryset for client
        queryset = super(FilterView, self).get_queryset()
        context = selected_client(self.request)
        queryset = queryset.filter(client=context['selected_client'][1]).annotate(
                amount_offered=Case(
                When( offer_eligibility__offer = self.kwargs['pk'] 
                ,then=F('offer_eligibility__amount_offered'))
                ,default=None))
        return queryset 

Мой Django-tables2:

    class offer_eligibility_table(ExportMixin,tables.Table):
    client_name = tables.Column(accessor='client__client_name')
    mySharePlan_ID = tables.Column(accessor='mySharePlan_ID')
    payroll_ID = tables.Column(accessor='payroll_ID')
    first_name = tables.Column(accessor='first_name')
    middle_name = tables.Column(accessor='middle_name')
    last_name = tables.Column(accessor='last_name')
    hire_date = tables.Column(accessor='hire_date')
    amount_offered = tables.Column(accessor='amount_offered')

Итак, чтобы пройтись по ответу, сначала мне нужно было отфильтровать по клиенту, затем мне нужно было добавить колонку в исходную модель, которая была моей суммой_предложения, но я хотел добавить значения только если сотрудник был в предложении, поэтому мне нужно было использовать функцию case, определенно рекомендую почитать условные выражения, если вы смотрите на мой вопрос и хотите получить аналогичную помощь.

https://docs.djangoproject.com/en/4.0/ref/models/conditional-expressions/

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