Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django Rest框架中获得模型方法的价值?_Python_Django_Django Models_Django Rest Framework - Fatal编程技术网

Python 如何在Django Rest框架中获得模型方法的价值?

Python 如何在Django Rest框架中获得模型方法的价值?,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,所以基本上我有一个django模型,它有很多朋友和两个运行在上面的方法。这是我的档案: Models.py: from django.db import models from django.contrib.auth.models import User class Profile(models.Model): first_name = models.CharField(max_length=50, blank=True) last_name = models.CharFie

所以基本上我有一个django模型,它有很多朋友和两个运行在上面的方法。这是我的档案:

Models.py:

from django.db import models
from django.contrib.auth.models import User


class Profile(models.Model):
    first_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50, blank=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    friends = models.ManyToManyField(User, blank=True, related_name='friends')

    def friends_list(self):
        return self.friends.all()

    def number_of_friends(self):
        return self.friends.all().count()
serializers.py:

from rest_framework import serializers
from .models import Profile


class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = '__all__'
Views.py:

from rest_framework import viewsets, permissions
from .models import Profile
from .serializers import ProfileSerializer


class ProfileViewSet(viewsets.ModelViewSet):
    queryset = Profile.objects.all()
    permission_classes = [
        permissions.AllowAny
    ]
    serializer_class = ProfileSerializer

问题是在Api中,方法的返回值不存在。例如,friends_list方法应该返回您拥有的朋友列表,即使这在传统的django项目中确实有效,django Rest框架也没有显示此方法的任何价值。如何修复此问题并获取两个方法的返回值以显示在api中?

由于模型序列化程序仅为序列化程序字段拾取模型字段,因此不会自动复制任何方法

您仍然可以通过API通过显式地添加两个字段来引用模型方法来发送此只读数据

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = [
            # need to explicitly define all fields I believe
            'friends_list',
            'number_of_friends',
        ]
既然声明了两个字段(与方法名称匹配),DRF应该为每个字段创建
SerializerMethodField
ReadOnly
字段(不确定是哪一个,但它们相似)。 它之所以有效,是因为它将这些字段的源设置为相同的名称,并且如果在模型上找到某些属性(在本例中为方法)

如果这不起作用,你可以

class ProfileSerializer(serializers.ModelSerializer):
    friends_list = serializers.SerializerMethodField()
    number_of_friends = serializers.SerializerMethodField()

    class Meta:
        model = Profile
        fields = [
            # need to explicitly define all fields I believe
            'friends_list',
            'number_of_friends',
        ]

    def get_friends_list(self, instance):
        return instance.friends_list()

    def get_number_of_friends(self, instance):
        return instance.number_of_friends()

由于模型序列化程序只为序列化程序字段拾取模型字段,因此不会自动复制任何方法

您仍然可以通过API通过显式地添加两个字段来引用模型方法来发送此只读数据

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = [
            # need to explicitly define all fields I believe
            'friends_list',
            'number_of_friends',
        ]
既然声明了两个字段(与方法名称匹配),DRF应该为每个字段创建
SerializerMethodField
ReadOnly
字段(不确定是哪一个,但它们相似)。 它之所以有效,是因为它将这些字段的源设置为相同的名称,并且如果在模型上找到某些属性(在本例中为方法)

如果这不起作用,你可以

class ProfileSerializer(serializers.ModelSerializer):
    friends_list = serializers.SerializerMethodField()
    number_of_friends = serializers.SerializerMethodField()

    class Meta:
        model = Profile
        fields = [
            # need to explicitly define all fields I believe
            'friends_list',
            'number_of_friends',
        ]

    def get_friends_list(self, instance):
        return instance.friends_list()

    def get_number_of_friends(self, instance):
        return instance.number_of_friends()