我想序列化一个模型,但是想要包含一个额外的字段,该字段需要对要序列化的模型实例进行一些数据库查找:
class FooSerializer(serializers.ModelSerializer):
my_field = ... # result of some database queries on the input Foo object
class Meta:
model = Foo
fields = ('id', 'name', 'myfield')
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?我看到你可以将额外的"上下文"传递给序列化器,是在上下文字典中传入附加字段的正确答案吗?使用这种方法,获得我需要的字段的逻辑不会与串行器定义一起自包含,这是理想的,因为每个序列化实例都需要my_field.在DRF序列化器文档的其他地方,它说 "额外的字段可以对应于模型上的任何属性或可调用".我正在谈论的是额外的领域吗?我应该在Foo模型定义中定义一个返回my_field值的函数吗?在序列化器中我将my_field挂钩到那个可调用的函数?那是什么样的?
在此先感谢,如有必要,请尽快澄清问题.
我有以下模型、序列化程序和视图。我的目标是传递一个自定义字符串,如
referrer = "pid=email&af_sub1=ui_1120&c=xyz"
Run Code Online (Sandbox Code Playgroud)
在POST方法中(下面RegisterViewSet)然后到viewset/serializer使用这个信息填写referral_campaign、referral_media和inviting_user
所以:1.referrer 是 write_only 字段 2.referrer 不是模型中的字段,但信息将用于填充模型中的字段
如何以 DRF 方式实现这一点?
class User(AbstractUser):
first_name = models.CharField(max_length=100, null=True, blank=True)
last_name = models.CharField(max_length=100, null=True, blank=True)
# social/viral feature related fields
referral_campaign = models.CharField(default="", max_length = 200, help_text="Campaign that led to the user signup")
referral_media_source = models.CharField(default="", max_length = 200, help_text="Campaign that led to the user signup")
inviting_user = models.ForeignKey('self', help_text="Inviting user", null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('first_name', 'last_name',)
write_only_fields = ('first_name', …Run Code Online (Sandbox Code Playgroud)