Python 无法为序列化程序django rest框架中的每个对象使用不同的字段

Python 无法为序列化程序django rest框架中的每个对象使用不同的字段,python,django,django-rest-framework,django-views,django-serializer,Python,Django,Django Rest Framework,Django Views,Django Serializer,我想创建一个类似udemy的web应用程序,并使用django rest框架作为后端,使用mysql作为数据库。 我有一个名为“课程”的模型,其中包含所有课程的列表,其中一个字段是“视频链接”。另外,我还有另一个模型名,它有两个外键字段:用户和课程。我想向所有用户显示课程,但对于下载字段,我必须查找结对用户,购买课程,如果他有课程,我将向他显示下载字段 我的视图集 我的序列化程序 管理员的完全访问权限: class FullAccessLessonsSerializer(serializers.

我想创建一个类似udemy的web应用程序,并使用django rest框架作为后端,使用mysql作为数据库。 我有一个名为“课程”的模型,其中包含所有课程的列表,其中一个字段是“视频链接”。另外,我还有另一个模型名,它有两个外键字段:用户和课程。我想向所有用户显示课程,但对于下载字段,我必须查找结对用户,购买课程,如果他有课程,我将向他显示下载字段

我的视图集 我的序列化程序 管理员的完全访问权限:

class FullAccessLessonsSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Assignments
        fields = ('id', 'title', 'description', 'dllink' )
未经身份验证的用户的基本访问权限:

class BasicAccessLessonsSerializer(serializers.ModelSerializer):

    class Meta:
            model = models.Assignments
            fields = ('id', 'title', 'description')
以及学生的部分访问:

class PartialAccessAssignmentsSerializer(serializers.ModelSerializer):
    """A serializer for all Lessons"""

    def __init__(self, *args, **kwargs):
        fields = kwargs.pop('fields', None)
        super(PartialAccessAssignmentsSerializer, self).__init__(*args,**kwargs)
        print(self.fields.get('id'))
        self.fields.pop('dllink')

    class Meta:
        model = models.Assignments
        fields = ('id','title','description','dllink' )

我做了任何我能找到的事,但我想不出来。我收到一个get错误或删除了所有dl链接。

如果您希望在用户无法访问时dllink为None。请使用以下方法:

class FullAccessLessonsSerializer(serializers.ModelSerializer):
    dllink = serializers.SerializerMethodField()

    def get_prescription_accept(self, instance):
        result =  True # lookup the pair (User , Lesson) in Purchases
        if result:
           return instance.dllink
        else:
           return ''

    class Meta:
        model = models.Assignments
        fields = ('id', 'title', 'description', 'dllink' )
如果要从数据中弹出dllink,请使用:

class FullAccessLessonsSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        data = super(FullAccessLessonsSerializer, self).to_representation(instance)
        result =  True # lookup the pair (User , Lesson) in Purchases
        if not result:
            data.pop('dllink')
        return data

    class Meta:
        model = models.Assignments
        fields = ('id', 'title', 'description', 'dllink' )

因此,您是否希望根据请求用户是否已下载分配来有条件地返回dllink?这有点令人困惑。您谈论模型、课程和购买,但在代码中,您只使用模型分配。因此,不清楚要在哪里显示哪些字段,以及在哪些条件下显示。我建议把它弄得更清楚一点,并包括模型。@HenryWoody我从Ykh那里得到了答案。非常感谢。否我想有条件地返回dllink,这取决于请求用户是否已经购买了课程。@Martin。是的,很抱歉。我想让它变得简单。我只发布了几行代码。也许我也必须发布我的模型。这是我在stackoverflow的第一个问题。谢谢你的评论。
class FullAccessLessonsSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        data = super(FullAccessLessonsSerializer, self).to_representation(instance)
        result =  True # lookup the pair (User , Lesson) in Purchases
        if not result:
            data.pop('dllink')
        return data

    class Meta:
        model = models.Assignments
        fields = ('id', 'title', 'description', 'dllink' )