Django REST - отправка нескольких наборов запросов в одном GET-ответе

В настоящее время мое представление принимает имя пользователя и, если пользователь существует, отправляет обратно набор всех записей в Модели, в которые вписывается соответствующий userid. Модель UserProject состоит из UserID и ProjectID, оба являются ссылками на собственные таблицы. Я хотел бы добавить модель Project в кверисет.

Мое мнение:

class GetUserDataByNameView(
    APIView,
):
    def get(self, request, username):
        if User.objects.filter(username = username).exists():
            uid = User.objects.get(username = username).id
            queryset = Userproject.objects.filter(user_id = uid)
            readSerializer = UserprojectSerializer(queryset, many = True)
            return Response(readSerializer.data)
        else:
            return Response({"status": "error", "data":"no user with this username"}, status = 200)

в настоящее время ответ выглядит следующим образом:

[
    {
        "id": 16,
        "created_at": "2021-10-20T16:05:03.757807Z",
        "updated_at": "2021-10-20T16:05:03.762307Z",
        "user": 3,
        "project": 50
    },
    {
        "id": 17,
        "created_at": "2021-10-20T16:27:59.938422Z",
        "updated_at": "2021-10-20T16:27:59.945439Z",
        "user": 3,
        "project": 51
       #"projectname": (from ProjectID 51)
       #"projectDescriptor":
       #" other stuff from ProjectModel":
    }
]

Итак, как мне вставить поля для текущего проекта? Если я сделал что-то бесполезное в коде, пожалуйста, скажите мне. Новичок в Django

serializer:

from rest_framework import serializers

from .models import Project
from .models import Userproject

class ProjectSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length = 500, required = True)
    descriptor = serializers.CharField(max_length = 1000,  default = None)

    class Meta:
        model = Project
        fields = '__all__'

class UserprojectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Userproject
        fields = '__all__'

модели:

from django.db import models
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
class UserprojectSerializer(serializers.ModelSerializer):
    projects = ProjectSerializer(many=True, read_only=True)
    class Meta:
        model = Userproject
        fields = ['projects','id','user',]

Вам нужно передать Project data в ваш UserProject Serializer, также я упомянул many=True, потому что User связан с ForeignKey, поэтому у пользователя может быть несколько projects.

class ProjectSerializer(serializers.ModelSerializer):
    name = serializers.CharField(max_length = 500, required = True)
    descriptor = serializers.CharField(max_length = 1000,  default = None)

    class Meta:
        model = Project
        fields = ['name','descriptor']
Вернуться на верх