这只是我的好奇心,但如果有人回答我的问题,我会很高兴。
我正在使用Django Rest Framework
,但我是个初学者。在serializers.py中,我使用ModelSerializer
和"all"
到fields
属性。这就是一个例子。
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
然后,我只是觉得
我们什么时候不在serializers.py
中使用"__all__"
只要我们提前创建models.py
,我想我们通常会使用每个Model
中的所有字段。当我们省略来自每个Model
的特定字段时,我希望您能教我。
谢谢。
所以第二个问题在评论中有点难以解释:
如果我们使用Model中所有字段的某些字段,我们如何存储其余字段的信息?
各种情况:
默认字段:
class Log(models.Model):
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class LogSerializer(serializers.ModelSerializer):
class Meta:
model = Log
fields = ('message',)
对于自动生成的,考虑通过postrongave信号或计算字段的用户配置文件模型:
class OrderLine(models.Model):
order = models.ForeignKey(Order)
name = models.CharField(max_length=200)
quantity = models.IntegerField()
price = models.DecimalField()
class OrderLineSerializer(serializers.ModelSerializer):
order = serializers.PrimaryKeyRelatedField()
product = serializers.IntegerField()
class Meta:
model = OrderLine
fields = ('quantity', 'product', 'order')
在这种情况下,产品是产品的主键。序列化程序将有一个保存方法,用于查找产品并将其名称和价格放在OrderLine上。这是标准做法,因为你不能在订单中引用产品,否则如果你改变产品的价格,你的订单就会改变。
来源于请求:
class BlogPost(models.Model):
author = models.ForeignKey(User)
post = models.TextField()
class BlogPostSerializer(serializers.ModelSerializer):
class Meta:
model = BlogPost
fields = ('post',)
def create(self, validated_data):
instance = BlogPost(**validated_data)
instance.author = self.context['request'].user
instance.save()
return instance
这几乎是常见的情况。
有很多种情况,但我认为主要有两种:
-
当您不希望所有字段都由序列化程序返回时。
-
当您需要序列化程序的某个方法来了解其字段时。在这种情况下,您应该遍历
fields
数组,但如果您使用__all__
,它就不起作用,只有当您有一个实际的字段列表时。