Select related не возвращает все значения из отношения в Django
Я делаю такой запрос
SELECT [User].[User_Id], [User].[Client_id], [User].[EMail], [User].[First_Name], [User].[Family_Name], [User].[Telephone], [Clients].[Client_Id], [Clients].[Name], [Clients].[Organization_type] FROM [User] INNER JOIN [Clients] ON ([User].[Client_id] = [Clients].[Client_Id]) WHERE [User].[EMail] = 'birna@athygli.is'
На SQL сервере все работает нормально, даже когда я печатаю в django, набор запросов выглядит хорошо, но, когда получаю результаты, не получаю их из таблицы Clients`, Это должно быть что-то с отношением между таблицами в Django, но я действительно не знаю где
Вот мои две модели
class V2_Clients(models.Model):
Client_Id = models.CharField(primary_key=True, max_length=50)
Name = models.CharField(max_length=255, null=True)
Organization_type = models.CharField(max_length=128, null=True)
class Meta:
managed = True
db_table = "[Clients]"
class V2_Users(models.Model):
User_Id = models.CharField(primary_key=True, max_length=50)
Client = models.ForeignKey(V2_Clients, on_delete=models.CASCADE)
EMail = models.CharField(max_length=250)
First_Name = models.CharField(max_length=50, null=True)
Family_Name = models.CharField(max_length=50, null=True)
Telephone = models.CharField(max_length=50, null=True)
class Meta:
managed = True
db_table = "[User]"
Вот где я делаю запрос, даже когда я делаю print(v2_user.query)
я получаю тот же SQL, показанный вверху, но не получает значения из таблицы Clients
только результаты из User
v2_user = V2_Users.objects.using('sl_v2').filter(EMail=jsonData['Client']['Client_Email']).select_related()
В чем может быть проблема?
Таким образом, у одного клиента может быть много пользователей, но у одного пользователя может быть только один клиент. Судя по вашим моделям. Вы хотите получить данные из таблицы User и всех связанных с ней таблиц, в данном случае Client. Если я правильно вас понял
views.py
user = V2_Users.objects.get(email=email_json)
return render(request, tmpl_name, {"user":user})
шаблон
First name: {{ user.First_name }}
Client: {{ user.client.Name }}
select_related
выполняет присоединение во внутреннем SQL (это означает, что если вы попытаетесь обратиться к объекту Client сразу после этого, ему не придется выполнять еще одну операцию SQL), но QuerySet, который возвращает Django, будет соответствовать определению QuerySet объекта.
Если вам нужна информация из таблицы Client
, вы, вероятно, захотите воспользоваться методом annotate, чтобы добавить информацию из столбцов в возвращаемый Queryset
Альтернативно, вы должны иметь возможность получить доступ к любой нужной вам информации из таблицы Client через v2_user.client
(как в предыдущем ответе).