Django Rest框架序列化程序验证其中一个的传递,但在另一个上失败
以下是我目前拥有的: models.py:Django Rest框架序列化程序验证其中一个的传递,但在另一个上失败,django,django-rest-framework,Django,Django Rest Framework,以下是我目前拥有的: models.py: class Team(models.Model): label = models.CharField(max_length=128, unique=True) def __str__(self) -> str: return self.label class AppName(models.Model): label = models.CharField(max_length=128, unique=T
class Team(models.Model):
label = models.CharField(max_length=128, unique=True)
def __str__(self) -> str:
return self.label
class AppName(models.Model):
label = models.CharField(max_length=128, unique=True)
def __str__(self) -> str:
return self.label
序列化程序.py
class TeamSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Team
fields = [
'id',
'label'
]
class AppNameSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = AppName
fields = [
'id',
'label'
]
这是我的职责:
appname = AppNameSerializer(data={'label': request.POST.get('appname')})
if appname.is_valid():
appname = appname.save()
team = TeamSerializer(data={'label': request.POST.get('team')})
if team.is_valid():
team = team.save()
其中request.POST.get'appname'是'foo name',request.POST.get'team'是'Chocobo骑士'
为什么appname.u有效或无效?而team.u的传球有效吗?它们实际上是相同的代码,我很困惑
TeamSerializer(data={'label': 'Chocobo Knights'}):
id = IntegerField(label='ID', read_only=True)
label = CharField(max_length=128, validators=[<UniqueValidator(queryset=Team.objects.all())>]) True
AppNameSerializer(data={'label': 'foo-app'}):
id = IntegerField(label='ID', read_only=True)
label = CharField(max_length=128, validators=[<UniqueValidator(queryset=AppName.objects.all())>]) False
序列化程序验证取决于数据库的状态
代码可能是相同的,但是如果团队表已经有一个Chocobo Knights,而AppName没有任何foo应用程序。。。不要期望两者的结果相同 等等,那么在DB中是否存在有效的检查?如果它已经存在,它会退出吗?
appname = AppNameSerializer(data={'label': request.POST.get('appname')})
if appname.is_valid():
appname = appname.save()
else:
appname = AppName.objects.get(**appname.data)
team = TeamSerializer(data={'label': request.POST.get('team')})
if team.is_valid():
team = team.save()
else:
team = Team.objects.get(**team.data)