Преобразование SQL-запроса на соединение в django ORM - PullRequest
1 голос
/ 29 сентября 2019

Я новичок в моделях django и пытаюсь преобразовать устаревшие запросы MySQL в модели django.У меня есть две таблицы tb1 и tb2.Я хочу соединить два и использовать оба их поля для получения результатов.

class Tb2(models.Model):
   tb2_id = models.ForeignKey('Tb1', models.DO_NOTHING, primary_key=True)
   profile = models.CharField(max_length=15)
   version = models.CharField(max_length=15)

class Tb1(models.Model):
   id = models.BigAutoField(primary_key=True)
   job_id = models.BigIntegerField(blank=True, null=True)

""" SELECT s.*, IF(count(distinct p.version)<=1, TRUE, FALSE) is_profile_same,
       MAX(p.version) ver,
       FROM tb1 s
       LEFT JOIN tb2 p ON p.tb2_id=s.id
       WHERE s.id in ('10','9') group by s.id  """

Tb1.tb1.filter().select_related('Tb2').annotate(join_profiles=Count('id'))

Я оставил объединенные две таблицы на идентификаторах.Я не уверен, как добавить условия if и max, используя поля tb2.Каждый раз, когда я пытаюсь использовать поля, это дает мне FieldError.

Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 29 сентября 2019

В ваших моделях есть что-то "странное".ForeignKey от Tb2 до Tb1 также является primary_key=True.Таким образом, это означает, что этот ForeignKey уникален, и поэтому может быть (максимум) один Tb2, который ссылается на Tb1.Таким образом, это означает, что COUNT(DISTINCT p.version) всегда будет максимум один.

Однако вы можете получить максимум данной версии с помощью:

Tb1.objects.filter(
    pk__in=[10, 9]
).annotate(
    <b>ver=Max('tb2__version')</b>
)

Если есть нет связанный Tb2 экземпляр, он передаст None атрибуту ver.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...