django - Django rest IntegrityError:1048,外键序列化程序上的“列不能为空”
问题描述
我的模型定义如下:
class Responsibility(models.Model):
name = models.CharField(max_length=50, blank=True, null=True, )
class Collaborator(models.Model):
name = models.CharField(max_length=50, blank=True, null=True, )
class Card(models.Model):
thing = models.CharField(max_length=50, blank=True, null = True, )
responsibilities = models.ForeignKey(Responsibility, related_name='res_cards', blank=True, on_delete=models.CASCADE)
collaborators = models.ForeignKey(Collaborator, related_name='col_cards', blank=True, on_delete=models.CASCADE)
和序列化器:
class CollaboratorSerializer(serializers.ModelSerializer):
class Meta:
model = Collaborator
fields = '__all__'
class ResponsibilitySerializer(serializers.ModelSerializer):
class Meta:
model = Responsibility
fields = '__all__'
class CardSerializer(serializers.ModelSerializer):
responsibilities = ResponsibilitySerializer(many=True,)
collaborators = CollaboratorSerializer(many=True,)
class Meta:
model = Card
fields = '__all__'
def create(self, validated_data):
responsibilities_data = validated_data.pop('responsibilities')
collaborators_data = validated_data.pop('collaborators')
card = Card.objects.create(**validated_data)
for responsibility_data in responsibilities_data:
Responsibility.objects.create(card=card, **track_data)
for collaborator_data in collaborators_data:
Collaborator.objects.create(card=card, **track_data)
return card
我的 POST 请求如下所示:
{u'thing': u'Book', u'responsibilities': [{u'name': u'Name'}, {u'name': u'ISBN'}], u'collaborators': [{u'name': u''}]}
但应用程序抛出上述错误。我错过了什么?职责和协作者并不预先存在,它们将与 Card 一起创建,也应该与 Card 一起更新,而不是独立更新。
更新:我对 GET 和 POST 的看法
@api_view(['GET', 'POST'])
def card_list(request):
"""
List all tasks, or create a new card
"""
if request.method == 'GET':
cards = Card.objects.all()
serializer = CardSerializer(cards, many=True)
return Response(serializer.data)
elif request.method == 'POST':
print(request.data)
serializer = CardSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(
serializer.errors, status=status.HTTP_400_BAD_REQUEST)
解决方案
这里可能会出现错误:card = Card.objects.create(**validated_data)
- 当您尝试创建Card
条目时;Django 期望Responsbility
和Collaborator
外键作为validated_data
. 这是因为您的架构的定义方式;外键不为空;Card
因此,如果没有这两个ForeignKey
条目,您将无法创建 a 。更改您的Card
模型以允许 nullresponsibilities
和collaborators
class Card(models.Model):
thing = models.CharField(max_length=50, blank=True, null = True, )
responsibilities = models.ForeignKey(Responsibility, related_name='res_cards', blank=True, null=True, on_delete=models.CASCADE)
collaborators = models.ForeignKey(Collaborator, related_name='col_cards', blank=True, null=True, on_delete=models.CASCADE)
如果更改架构不是一种选择;反转方法中的操作顺序create
:
for responsibility_data in responsibilities_data:
resp = Responsibility.objects.create(**responsibility_data)
for collaborator_data in collaborators_data:
collab = Collaborator.objects.create(**collaborator_data)
validated_data.update({responsibilities: resp.pk, 'collaborators': collab.pk})
card = Card.objects.create(**validated_data)
从您的问题来看,您似乎需要将一张卡与多个职责和合作者相关联。您应该将外键移动到其他表(resp 和 colllab)以指向卡片,而不是从卡片向前指向。
推荐阅读
- python - 如何解决“名称'mainWin'未定义”错误
- lucene - 如何将 FunctionScoreQuery 与文本字段一起使用?
- gnu-make - Make:动态子目录的静态配方
- java - 如何使用 BufferedReader 从命令行输出中获取带有特殊字符的字符串
- asp.net - ASP.NET Textbox is losing focus after Postback
- c# - GetInstanceExtensions<> 方法中的工作流扩展 NULL
- string - Hive:删除字符串列中的空格
- sql - 需要获取日期时间范围之间的用户数
- julia - 有没有办法阻止 Julia 使用 BigFloats 的科学(指数)表示法?
- java - 过滤logstash输入