我的用例是,有一个 Workshop ,其中有多个职位( Workshop_Position )。对于任何职位,都会有多个应用程序。研讨会负责人必须批准用户成为研讨会的 team_member 申请。
我为此使用了ManyToMany关系,请参见下面的模型。
class Workshop(models.Model):
...
team_members = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='member_in_workshops', through='Membership')
...
class Workshop_Position(models.Model):
position_heading = models.CharField(max_length=100, null=False, blank=False)
...
class Membership(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='membership', blank=True, null=True, on_delete=models.CASCADE)
position = models.ForeignKey('Workshop_Position', related_name='membership', on_delete=models.CASCADE)
workshop = models.ForeignKey('Workshop', related_name='membership', on_delete=models.CASCADE)
date_joined = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ("position", "user")
因此,当创建新职位时,我将该职位保存到 Workshop_Position 表中,并尝试使用 null 用户将该职位所属的车间保存到会员资格。我需要使用一个空用户保存此文件,因为将要向Workshop_Position提交多个应用程序,并且所有者选择哪个用户进入该职位。我正在做下面的事情,
{
"user": " ",
"position": "3",
"workshop": "1"
}
请在下面找到我的MembershipSerializer
class MembershipSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(queryset = UserProfile.objects.all(), allow_null=True)
position = serializers.PrimaryKeyRelatedField(queryset = Workshop_Position.objects.all())
workshop = serializers.PrimaryKeyRelatedField(queryset = Workshop.objects.all())
class Meta:
model = Membership
extra_kwargs = {
'user': {'required': False, 'allow_null': True}
}
fields = ('id', 'user', 'position', 'workshop', 'date_joined')
但是当我尝试将以上内容保存到会员模型时,我得到了一个错误。
“用户”:[“此字段不能为空。” ]
为什么会出现此错误?我已经在会员模型中为用户提供了 blank = True,null = True
有人可以帮我吗?
谢谢!
答案 0 :(得分:1)
您是否正在使用DRF ModelSerializer?在这种情况下,您需要在您的序列化器类元中声明它。
class MembershipSerializer(serializers.ModelSerializer):
class Meta:
model = Membership
extra_kwargs = {
'user': {'required': False, 'allow_null': True} # the allow_null might not be needed
}
编辑
我检查了PrimaryKeyRelatedField的DRF文档。如您所见,有这样的事情。
allow_null - If set to True, the field will accept values of None or the empty string for nullable relationships. Defaults to False.
因此,您需要像这样更改所有PrimaryKeyRelatedField
。
serializers.PrimaryKeyRelatedField(queryset=your_queryset, allow_null=True)