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/