我有以下型号:
class ModelX(models.Model):
STATUS_CHOICES = (
(0, 'ABC'),
(1, 'DEF'),
)
status = models.IntegerField(choices=STATUS_CHOICES)
user = models.ForeignKey(Users)
class Users(models.Model):
phone_number = models.Charfield()
和ModelX的序列化程序是:
class ModelXSerializer(serializers.ModelSerializer):
phone_number = serializers.PrimaryKeyRelatedField(
source='user', queryset=Users.objects.get(phone_number=phone_number))
class Meta:
model = ModelX
fields = ('phone_number',)
在创建ModelX
记录的请求中,我得到phone_number
而不是user_id。现在,我要触发过滤查询以获取user
实例。我该怎么做,即Users.objects.get(phone_number=phone_number)
此外,创建记录时,status
字段将始终为0
。客户端不会在正文中发布status
参数。它的内在逻辑。 serializers
中是否有办法可以自动将status
字段设置为0
。 请不要建议将此字段设置为默认值= 0 。这背后有一些逻辑。这只是问题陈述的较短版本。
答案 0 :(得分:2)
您可以使用自定义create
方法尝试此类版本的序列化程序:
class ModelXSerializer(serializers.ModelSerializer):
phone_number = serializers.serializers.CharField(source='user.phone_number')
class Meta:
model = ModelX
fields = ('phone_number',)
def create(self, validated_data):
phone_number = validated_data['phone_number']
user = Users.objects.get(phone_number=phone_number)
instance = ModelX.objects.create(status=0, user=user)
return instance
有关source参数的详细信息。
答案 1 :(得分:1)
您可以在validate
功能中添加
class ModelXSerializer(serializers.ModelSerializer):
def validate(self, attrs):
attrs = super(ModelXSerializer, self).validate(attrs)
attrs['status'] = 0
return attrs