получить запись из нескольких таблиц без отношения внешнего ключа django

У меня есть две модели джанго

class Users(models.Model):
    id=models.ForeignKey(VirtualMachines, null=True)
    email=models.EmailField(null=True)

class UsersDomains(models.Model):
    domain_email = models.EmailField(null=True)
    domain=models.CharField(null=True)

Я хочу выбрать записи из этих таблиц, используя внутреннее соединение. модели не связаны между собой, поэтому я не могу использовать select_related. Мой sql-запрос:

SELECT u.*, du.* FROM
users u 
JOIN user_domain du 
ON du.domain_email = u.email 

без использования select_related, как мне написать запрос ORM django в ту же запись, что и мой запрос sql.

Спасибо!


person Kevin    schedule 21.03.2014    source источник


Ответы (2)


Я не знаю, почему вы говорите, что у вас нет отношений между этими двумя моделями. Вы делаете: он просто использует поле char, а не идентификатор. Это все еще вполне допустимый внешний ключ. Вы должны объявить свой UserDomain следующим образом:

class UsersDomains(models.Model):
    domain_email = models.ForeignKey(Users, to_field='email', null=True)

а также добавить unique=True в поле Users.domain, и теперь Django автоматически сделает все правильно.

person Daniel Roseman    schedule 21.03.2014
comment
Спасибо @Daniel за указание на это. Я закончил тем, что сделал то же самое, что вы упомянули. Теперь он работает идеально. - person Kevin; 21.03.2014
comment
после преобразования поля в ForeignKey я получаю эту ошибку ''объект 'bool' не имеет атрибута 'startswith' ''. - person Kevin; 21.03.2014
comment
@ Дэниел Роузман, что, если у меня есть уникальная комбинация ключей, как я могу этого добиться? - person Sourav Prem; 04.07.2017

может это поможет -

http://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

в основном это просто использование queryset.query.join для добавления любого соединения, которое вы хотите.

person Gabriel Amram    schedule 21.03.2014
comment
Между двумя моделями в примере есть много-много отношений. Будет ли это работать для меня? потому что у меня нет отношения между моделями. - person Kevin; 21.03.2014