Получение объектов внешнего ключа в запросе

У меня есть две модели. Первая представляет различные проекты с именем, 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)

В результате будут получены только те столбцы, которые вы указали в качестве параметров.

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