【发布时间】: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