Получение объектов внешнего ключа в запросе
У меня есть две модели. Первая представляет различные проекты с именем, ID и описанием. Вторая предназначена для отслеживания того, какой пользователь находится в каком проекте. Итак, мои модели выглядят следующим образом:
from django.contrib.auth.models import User
# Create your models here.
class Project(models.Model):
id = models.AutoField(db_column = 'db_ID', primary_key = True)
name = models.CharField(max_length=500, default = None)
descriptor = models.CharField(max_length = 1000, null = True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'projects'
def __str__(self):
return self.name
class Userproject(models.Model):
id = models.AutoField(db_column = 'db_ID', primary_key = True)
user = models.ForeignKey(User, on_delete= models.SET_NULL, null = True)
project = models.ForeignKey('Project', on_delete = models.SET_NULL, null = True)
created_at = models.DateTimeField(auto_now_add=True, null=True)
updated_at = models.DateTimeField(auto_now=True, null = True)
class Meta:
db_table = 'UserProjects'
def __str__(self):
return self.id
В Userproject есть только UserID и ProjectID, оба являются ForeignKeys для других моделей.
Когда я получаю GET-запрос с именем пользователя, я могу получить userID, затем я могу отфильтровать все Userprojects по userID и сериализовать все те, где присутствует данный ser. Но как мне включить данные о проекте, если я хочу послать также и имя проекта?
Таким образом, вы можете запустить запрос с силовыми операторами для фильтрации данных на основе значений иностранных объектов.
user_projects = Userproject.objects.filter(user_id=user_id, project__name='yourproject')
Теперь для доступа к данным проекта из user_project можно использовать оператор .
.
if user_projects.exists():
print(user_projects[0].user_id)
print(user_projects[0].project.name)
print(user_projects[0].project.descriptor)
Чтобы получить значения непосредственно из ORM, используйте .values()
.
user_projects = Userproject.objects.filter(user_id=user_id, project__name='yourproject').values('project__name', 'project__descriptor)
В результате будут получены только те столбцы, которые вы указали в качестве параметров.