Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“Django”列中的空值;“用户id”;违反非空约束_Django_Post_Django Rest Framework_Constraints - Fatal编程技术网

“Django”列中的空值;“用户id”;违反非空约束

“Django”列中的空值;“用户id”;违反非空约束,django,post,django-rest-framework,constraints,Django,Post,Django Rest Framework,Constraints,我有一个模型用户首选项,它引用了Django模型用户。我不断地犯错误: IntegrityError:user\u id列中的null值违反了not null约束 详细信息:失败的行包含(dfac4cb7-0bdb-44e4-b951-c0c9386bf143,f,null) 尝试发布新用户首选项时。我为邮寄发送的数据是: { "user": "http://127.0.0.1:8000/user/4/", "send_email": false } 我的用户偏好模型是: im

我有一个模型用户首选项,它引用了Django模型用户。我不断地犯错误:
IntegrityError:user\u id列中的null值违反了not null约束
详细信息:失败的行包含(dfac4cb7-0bdb-44e4-b951-c0c9386bf143,f,null)
尝试发布新用户首选项时。我为邮寄发送的数据是:

{
    "user": "http://127.0.0.1:8000/user/4/",
    "send_email": false
}
我的用户偏好模型是:

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')
有什么建议吗

编辑:将post方法添加到我的视图解决了这个问题。在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)

这是因为这里的这一行:

user = models.OneToOneField(User, related_name="user_preference", on_delete=models.CASCADE, db_index=True)
UserPreference
Model
中,当您指定该字段/关系时,您的意思是
用户必须存在外键。一个没有,所以你得到了那个错误

在POST或create方法中,将
user
指定为整数
id
,因为它是主键

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