2017-03-05 4 views
0

Ich bekomme nicht null Contraint fehlgeschlagen Fehler beim Posten einer Gruppe. Wie soll ich das beheben? Ich möchte den Benutzer nicht in der API anzeigen, also habe ich ihn nicht in den Serializer-Feldern verwendet. Muss ich es dort zwangsweise hinzufügen?NOT NULL Constraint fehlgeschlagen: device_api_devicegroup.owner_id

Hier ist mein Modell, Serializer und 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

Worauf sollte der 'Besitzer' gesetzt werden, wenn er in der API weggelassen wird? –

+0

Ich möchte nicht, dass der Besitzer in der Listenansicht erscheint. Für das Posten sollte es wissen, welcher Benutzer gepostet hat, weil ich die Gruppen basierend auf seinem Besitzer filtere. – pythonBeginner

Antwort

1

diese sorgfältig zu sehen, die Benutzer nicht in request.data ist:

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

überprüfen auch, dass der Serializer der Eigentümer verwendet werden können

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

ich bekomme MultiValueDictKeyError um/api/v1/device_groups "Token" Fehler – pythonBeginner

+0

request.data hat request.data pythonBeginner

+0

Das bedeutet, dass Sie nicht die ID- und Token-Felder vom Frontend senden, verstehe ich, dass Sie diese beiden brauchen? Ändern Sie den Code auch nach Bedarf. Meine Absicht war, dass Sie darauf achten, woher Sie die Daten erhalten (request.data vs request.user) – jperelli

Verwandte Themen