【问题标题】:Getting field value with DjangoRestFramework serializer使用 DjangoRestFramework 序列化程序获取字段值
【发布时间】:2020-08-08 07:03:47
【问题描述】:

我有两个模型:

class Restaurant(models.Model):    
    adress = models.CharField(max_length=240)    
    name = models.CharField(max_length=140)

class RestaurantReview(models.Model):    
    review_author = models.ForeignKey(settings.AUTH_USER_MODEL,
                                      on_delete=models.CASCADE)    
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

我使用 DRF 和前端,我需要在 Vue.je 模板中使用的字段值。这是我的序列化程序:

class RestaurantReviewSerializer(serializers.ModelSerializer):
    restaurant_name = serializers.CharField(source='restaurant.name')
    restaurant_adress = serializers.CharField(source='restaurant.adress')
    created_at = serializers.SerializerMethodField()
    review_author = serializers.StringRelatedField(read_only=True)

class Meta:
    model = RestaurantReview
    fields = ('id','restaurant_name','restaurant_adress','created_at','review_author')
    def get_created_at(self, instance):
        return instance.created_at.strftime("%d %B, %Y")

我得到了我需要的正确数据,但我现在的问题是我无法更新/创建新模型。正如我所建议的那样,我添加了 ('read_only'=True) 但结果是一样的。

我是否应该使用 to_representation 来获得与使用相同的 CRUD 可能性:

class RestaurantReviewSerializer(serializers.ModelSerializer):
     class Meta:
         model = RestaurantReview
         field = fields = '__all__'

但是有一个好处,例如 'restaurant' 以其名称而不是其 ID 命名,以便我可以在我的模板中使用它?

【问题讨论】:

  • 是的,您可以使用 to_representation。或者,您可以使用不同的序列化器进行创建/更新和获取。
  • 最好的方法是什么(因为我对 DRF 很陌生)?也许使用我有的两个 RestaurantReviewSerializer(当然重命名一个),创建一个新的 Viewset 和一个新的 api url 用于创建/更新?
  • 不使用单一视图集。覆盖 get_serializer_class 方法。

标签: django serialization django-rest-framework


【解决方案1】:

按照上面的评论。

使用单个视图集并覆盖 get_serializer_class。没有其他需要改变的地方。

class RestaurantReviewViewSet(viewsets.ModelViewSet):
    queryset = RestaurantReview.objects.all()

    def get_serializer_class(self):
        if self.request.method == 'GET':
            return RestaurantReviewGETSerializer # your above serializer
        else:
            return RestaurantReviewSerializer # default serializer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-22
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 2021-02-13
    • 2014-01-04
    • 2015-08-23
    相关资源
    最近更新 更多