2016-08-22 17 views
1

私はDjangoモデルユーザを参照するモデルuserpreferenceを持っています。私はエラーが発生し続ける: IntegrityError: null value in column "user_id" violates not-null constraint DETAIL: Failing row contains (dfac4cb7-0bdb-44e4-b951-c0c9386bf143, f, null) 新しいuserpreferenceを投稿しようとすると。私はポストのために送られたデータは以下のとおりです。カラム "user_id"のDjangoヌル値がnullでない制約に違反しています

{ 
    "user": "http://127.0.0.1:8000/user/4/", 
    "send_email": false 
} 

私userpreferenceモデルは次のとおりです。

class UserPreferenceList(generics.ListCreateAPIView): 
    model = UserPreference 
    permission_classes = (permissions.IsAuthenticated, CustomObjectPermissions) 
    serializer_class = UserPreferenceListSerializer 
    queryset = UserPreference.objects.all() 


class UserPreferenceDetail(generics.RetrieveUpdateDestroyAPIView): 
    model = UserPreference 
    permission_classes = (permissions.IsAuthenticated, CustomObjectPermissions) 
    serializer_class = UserPreferenceSerializer 
    queryset = UserPreference.objects.all() 

と私のuserpreferenceシリアライザは、次のとおりです:

import uuid 
from django.db import models 
from django.contrib.auth.models import User 


class UserPreference(models.Model): 
    class Meta: 
     app_label = 'my_app' 
     permissions = (
      ('view_userpreference', 'View User Preference'), 
     ) 

    uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4) 
    user = models.OneToOneField(User, related_name="user_preference", on_delete=models.CASCADE, db_index=True) 
    send_email = models.BooleanField(default=True, db_index=True) 


    def __unicode__(self): 
     return u"<UserPreference {0} {1}>".format(str(self.uuid), self.user.id) 

私userpreference図である

class UserPreferenceSerializer(serializers.HyperlinkedModelSerializer): 
    user = serializers.HyperlinkedRelatedField(view_name='user-detail', read_only=True, lookup_field="id", lookup_url_kwarg="pk") 

    class Meta: 
     model = UserPreference 
     fields = ('url', 
        'user', 
        'send_email') 


class UserPreferenceListSerializer(serializers.HyperlinkedModelSerializer): 
    user = serializers.HyperlinkedRelatedField(view_name='user-detail', read_only=True, lookup_field="id", lookup_url_kwarg="pk") 

    class Meta: 
     model = UserPreference 
     fields = ('url', 
        'user', 
        'send_email') 

提案がありますか?

編集:私のビューに投稿メソッドを追加すると、この問題が解決されました。 UserPreferenceListクラスでは、私がコメントを追加しました:理由はここにこのラインの起こっている

def post(self, request, *args, **kwargs): 
    user_url = request.data.get('user', None) 
    if user_url: 
     try: 
      path = urlparse.urlparse(user_url).path 
      match = resolve(path) 
      user_pk = match.kwargs.get('pk') 
     except (Resolver404, User.DoesNotExist) as e: 
      raise CustomAPIException("You need to send the url of a User to create its UserPreference.", status=status.HTTP_400_BAD_REQUEST) 
    else: 
     raise CustomAPIException("You need to identify a User to create its UserPreference.", status=status.HTTP_400_BAD_REQUEST) 

    userpreference_obj = UserPreference(user_id=user_pk, send_email=request.data.get('send_email', False)) 
    userpreference_obj.save() 
    d = UserPreferenceSerializer(userpreference_obj, context={'request': request}).data 
    return Response(d, status=status.HTTP_201_CREATED) 

答えて

1

:あなたがそのフィールド/関係を指定UserPreferenceModel

user = models.OneToOneField(User, related_name="user_preference", on_delete=models.CASCADE, db_index=True) 

は、あなたが外国人と言っていますUserのキーが存在する必要があります。 1つはしないので、あなたはそのエラーを取得しています。

POSTで、またはメソッドを作成する場合は、idがプライマリキーであるため、userを整数として指定します。

関連する問題