我们什么时候不使用 Django Rest Framework 中的 ModelSerializer 中的 "__all__"



这只是我的好奇心,但如果有人回答我的问题,我会很高兴。

我正在使用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__,它就不起作用,只有当您有一个实际的字段列表时。

最新更新