无法在中间模型-Django

时间:2019-11-23 16:45:26

标签: python django

我的用例是,有一个 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

有人可以帮我吗?

谢谢!

1 个答案:

答案 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)