【问题标题】:Django Rest Framework - self.request.user in model methodDjango Rest Framework - 模型方法中的 self.request.user
【发布时间】:2018-07-13 21:43:01
【问题描述】:

我有一个模型:

User 是来自django.contrib.auth.models 的 django 用户模型

# drink/models.py
class Drink(models.Model):
    name = models.CharField(max_length=32)
    bartender = models.ForeignKey('bartender.Bartender')

# bartender/models.py
class Bartender(models.Model):
    name = models.CharField(max_length=64)
    owner = models.ForeignKey(User)

# property/models.py
class Rating(models.Model):
    bartender = models.ForeignKey('bartender.Bartender')
    owner = models.ForeignKey(User)

我使用 django rest 框架,并且想要一个序列化器字段:

# bartender/serializers.py
class BartenderSerializer(serializers.ModelSerializer):
    rating = serializers.IntegerField(source='get_rating', read_only=True)

    class Meta:
        model = Bartender
        fields = []

我的视图集是

class BartenderViewset(viewsets.ModelViewSet):
    queryset = Bartender.objects.all()
    serializer_class = BartenderSerializer

如何将模型方法添加到我的 Bartender 模型中,以便它为 User 进行调用的任何对象返回 Rating 对象。

我尝试对我的Bartender 类进行此修改:

# bartender/models.py
class Bartender(models.Model):
    name = models.CharField(max_length=64)
    owner = models.ForeignKey(User)

    def get_rating(self):
        return Rating.objects.get(bartender=self.id, owner=self.request.user)

但是self 没有请求。因此,我想知道如何实现它,以便可以通过 drf 视图集调用它。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    实际上,您可以在不修改模型的情况下做到这一点。只需使用SerializerMethodField 评估序列化程序级别的数据:

    class BartenderSerializer(serializers.ModelSerializer):
        rating = serializers.SerializerMethodField()
    
        class Meta:
            model = Bartender
            fields = []
    
        def get_rating(self, obj):
            return Rating.objects.get(bartender=obj.id, owner=self.context.get('request').user).values('rating')
    

    【讨论】:

    • 非常感谢!这完美地工作。但是,我必须添加.values('rating'),因为我收到了错误Object Rating is not JSON serializable 我相应地编辑了您的答案。
    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 2014-10-27
    • 2018-12-02
    • 2019-12-10
    • 2021-12-23
    • 1970-01-01
    • 2022-01-07
    • 2013-11-11
    相关资源
    最近更新 更多