失败NOT NULL约束:device_api_devicegroup.owner_id

问题描述:

我得到张贴,同时一组不为空contraint失败的错误。我应该如何解决它?我不想在api中显示用户,所以我没有在序列化程序字段中使用它。我必须在那里强制添加它吗?失败NOT NULL约束:device_api_devicegroup.owner_id

这里是我的模型,串行和APIView

class DeviceGroup(models.Model): 
    token = models.UUIDField(default=uuid.uuid4, unique=True, editable=False) 
    name = models.CharField(max_length=250, blank=False, null=False) 
    owner = models.ForeignKey(User, blank=False, null=False) 


class DeviceGroupSerializer(serializers.ModelSerializer): 
    id = serializers.UUIDField(source='token', format='hex', read_only=True) 
    class Meta: 
     model = DeviceGroup 
     fields = ['id','name'] 


class DevicesGroupsAPIView(APIView): 
    permission_classes = (permissions.IsAuthenticated,) 
    serializer_class = DeviceGroupSerializer 

    def get_object(self, user, token): 
     try: 
      return BaseDevice.objects.filter(owner=user).get(token=token) 
     except ObjectDoesNotExist: 
      return error.RequestedResourceNotFound().as_response() 

    def get(self, request, format=None): 
     """ 
      Returns a list of groups 
     """ 
     reply = {} 
     try: 
      groups = DeviceGroup.objects.filter(owner=request.user) 
      reply['data'] = DeviceGroupSerializer(groups, many=True).data 
     except: 
      reply['data'] = [] 
     return Response(reply, status.HTTP_200_OK) 

    def post(self, request, format=None): 
     """ 
     create a new group 
     """ 
     print('request.data', request.data) 
     print('user', request.user) 
     serializer = DeviceGroupSerializer(data=request.data) 
     print('serializer', serializer) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializers.data, status.HTTP_200_OK) 
     return Response(serializer.errors, status.HTTP_204_NO_CONTENT) 
+0

应该采取什么'owner'被设定为如果从API省略? –

+0

我只是不想让所有者出现在列表视图中。对于发布,它应该知道哪个用户发布了,因为我正在基于其所有者过滤这些组。 – pythonBeginner

看到这样认真,用户是不是在request.data:

serializer = DeviceGroupSerializer(data={ 
    'name':request.data['name'], 
    'owner':request.user.id, 
}) 

还检查串行允许所有者使用

from django.contrib.auth.models import User 

class DeviceGroupSerializer(serializers.ModelSerializer): 
    id = serializers.UUIDField(source='token', format='hex', read_only=True) 
    owner = serializers.PrimaryKeyRelatedField(queryset=User.objects.all()) 
    class Meta: 
     model = DeviceGroup 
     fields = ['id','name', 'owner'] 
+0

我在/ api/v1/device_groups上得到MultiValueDictKeyError “'token'”error – pythonBeginner

+0

request.data has request.data pythonBeginner

+0

这意味着你没有从前端发送id和token字段,我知道你需要这两个吗?另外,根据需要修改代码。我的本意是,你要注意,你在哪里得到(request.data VS request.user) – jperelli