Как получить вложенные объекты в DRF - PullRequest
0 голосов
/ 21 июня 2020

У меня две модели Role и User. Модель User имеет поле внешнего ключа , связанное с моделью Role.

Модель Role

class Role(models.Model):
    
    role_name = models.CharField(max_length=255, blank=False, unique=True)

    def __str__(self):

        return 'Role Object ({})'.format(self.id, self.role_name)

Модель User

class User(AbstractBaseUser, PermissionsMixin):
    
    first_name = models.CharField(max_length=255, blank=False)
    last_name = models.CharField(max_length=255, blank=False)
    email = models.EmailField(max_length=255, blank=False, unique= True)
    phone_number = models.BigIntegerField(blank=False, unique= True)
    password = models.TextField(blank=False)
    company_name = models.CharField(max_length=255, null=True, unique=True)
    is_active = models.BooleanField(default= False)
    role = models.ForeignKey(Role, related_name='group_name', on_delete=models.CASCADE, blank=False)
    business = models.ForeignKey(Businesses, on_delete=models.CASCADE, null=True)

    objects = UserManager()

    USERNAME_FIELD = 'email'

    def __str__(self):

        return 'User Object ({})'.format(self.id)

Используя ModelSerializer и ListAPIView Я хочу получить список всех пользователей, как показано ниже -

{
    "first_name": "",
    "last_name":"",
    "email":"",
    "phone_number":,
    "is_active":"",
    "role":{
            "id":1,
            "role_name": "Admin"
           }
}

Кроме того, я создал сериализаторы -

class AdminSerializer(serializers.ModelSerializer):

    role = RoleSerializer(read_only=True)

    class Meta:
        model = User
        fields = ['id', 'first_name', 'last_name', 'email', 'phone_number', 'password', 'role', 'is_active' ]
        read_only_field = ['role_name']
        extra_kwargs = {
            'password':{
                'write_only':True
            },
            'is_active':{
                'required':False
            }
        }

    def create(self, validated_data):

        return User.objects.create_user(**validated_data)


class RoleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Role
        field = ['id', 'role_name']

Что именно я должен сделать со своим сериализатором для достижения желаемого результата. Что именно я должен написать в моем ListAPIView(), что возвращает ListAPIVIew.

class UsersListAPIView(ListAPIView):

        queryset = User.objects.all()
        serializer_class = AdminSerializer 

        def list(self, request):
            queryset = self.get_queryset().filter(role=request.query_params.get['id']).prefetch_related("group_name")
            serializer = AdminSerializer(queryset, many=True)
            return Response(serializer.data)

Это возвращает ошибку -

TypeError: 'method' object is not subscriptable
...