【发布时间】:2021-05-06 19:44:50
【问题描述】:
我有一个表单,用户可以在其中发布交易,为此他们可以选择上传图片 (x),或者提供指向互联网上已上传图片的链接 (y)。因此,当任何一个字段存在并且有效时,我想从验证中取消另一个字段。这是一个简化的模型:
class Deal(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='deals',
on_delete=models.CASCADE)
title = models.CharField(max_length=1024, blank=False, null=False)
slug = models.SlugField(max_length=1024, unique=True, blank=True)
poster = models.ImageField()
poster_url = models.CharField(max_length=1024, blank=True, null=True)
created = models.DateField(auto_now_add=True)
updated = models.DateField(auto_now=True)
这是我的序列化程序:
class DealSerializer(serializers.ModelSerializer):
user = UserSerializer(many=False, read_only=True)
class Meta:
model = Deal
fields = '__all__'
def validate_poster_url(self, value):
poster = self.initial_data.get("poster")
if value == "" and poster == "":
# set to mutable
self.initial_data._mutable = True
self.initial_data.delete("poster")
raise serializers.ValidationError(
"Deal must either have a Poster or a Poster URL")
return value
def validate_poster(self, value):
poster_url = self.initial_data.get("poster_url")
if value != "":
if poster_url == "":
# set to mutable
self.initial_data._mutable = True
self.initial_data.delete("poster_url")
raise serializers.ValidationError(
"Deal must either have a Poster or a Poster URL")
return value
def create(self, validated_data):
deal, _ = Deal.objects.update_or_create(**validated_data)
return deal
当我提交例如一个 poster_url 时,poster 字段仍然得到验证,并且我收到一个验证错误:
poster: ["The submitted data was not a file. Check the encoding type on the form."]
我曾尝试从 initial_data 中“删除”必填字段,但这不起作用,我还尝试使用全局 validate(),但从未调用过它。我真的很感激任何帮助。谢谢。
【问题讨论】:
标签: python django validation django-rest-framework