Django ORM объединяет две модели без отношений первичный ключ/внешний ключ

Я уже некоторое время программирую API с помощью Django Rest Framework, но мне еще не приходилось вызывать более сложные соединения, чем те, которые создаются по умолчанию с помощью удобного построения отношений PK/FK, которое использует Django.

Одна из проблем, с которой я сталкиваюсь, заключается в создании многоуровневых соединений между моделями, когда модели не имеют отношения первичных и внешних ключей. Также невозможно, чтобы сами связанные поля были уникальными между клиентами и источником.

from django.db import models

class Customers(models.Model):
    address_key = models.CharField(db_column='address_key', max_length=40)
    lastname_key = models.CharField(db_column='lastname_key', max_length=5)
    firstname_key = models.CharField(db_column='firstname_key', max_length=4) 
    fname = models.CharField(db_column='fname', max_length=255)
    lname = models.CharField(db_column='lname', max_length=255)
    address = models.CharField(db_column='address', max_length=255)
    city = models.CharField(db_column='city', max_length=255)
    state = models.CharField(db_column='state', max_length=255)
    zip = models.CharField(db_column='zip', max_length=255)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['address_key', 'lastname_key', 'firstname_key'], name='unique customer')
        ]


class Attributes(models.Model):
    address_key = models.CharField(db_column='address_key', max_length=40)
    lastname_key = models.CharField(db_column='lastname_key', max_length=5)
    firstname_key = models.CharField(db_column='firstname_key', max_length=4)
    attr_1 = models.CharField(db_column='attr_1', max_length=255)
    attr_2 = models.CharField(db_column='attr_2', max_length=255)
    attr_3 = models.CharField(db_column='attr_3', max_length=255)

Ниже приведен пример SQL join, которого я хочу достичь, используя ORMs Django.

SELECT attr_1, attr_2, attr_3 
FROM Attributes a
JOIN Customers c
ON c.address_key = a.address_key
AND c.lastname_key = a.lastname_key
AND c.firstname_key = a.firstname_key

Я узнал из документации и нескольких других сообщений/ответов на stack overflow, что select_related() является ключевым процессом для создания объединений, но для этого требуются отношения ForeignKey, которые требуют, чтобы связанный ключ (в данном случае три первых поля "_key" из Customers) был уникальным, чего не может быть. Технически они могут и должны быть уникальными вместе, как отмечено в ограничении.

Любая помощь будет признательна заранее!

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