django - 完整性错误: null value in column "user_id" violates not-null constraint (Django Rest Framework)

标签 django python-3.x django-models django-rest-framework django-views

我是 Django Rest Framework 的新手,我收到一个完整性错误,正在尝试解决

简介:我有 2 个模型患者胚胎。 Patient 是 Django 默认用户的外键。只有 1 位用户是 super 用户。所有患者都属于 super 用户。每个患者可以有许多胚胎。我正在使用 Django Rest Framework 的 ModelViewset

为 2 个模型创建 View

IntegrityError: null value in column "user_id" violates not-null constraint

下面是我收到的错误消息的屏幕截图

enter image description here

以下是我的模型

class Patient(models.Model):
    """Patients model which has all the patients information"""
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=35)
    phone = models.CharField(max_length=18)
    email = models.EmailField(unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    @property
    def full_name(self):
        return "%s %s" % (self.first_name, self.last_name)

    def __str__(self):
        return self.email


class Embryo(models.Model):
    """A ForeignKey model to the patient"""
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
    code_name = models.CharField(max_length=100)
    karyotype = models.CharField(max_length=100)
    down_syndrome = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    GENDER_CHOICES = (
        ("M", "Male"),
        ("F", "Female"),

    )
    sex = models.CharField(max_length=1, choices=GENDER_CHOICES)

    def __str__(self):
        return self.code_name

我使用ModelViewSet为我的模型创建实例下面是我的观点。

 class PatientsApiView(viewsets.ModelViewSet):
    """Handles Creating, reading and updating Patients"""

    serializer_class = serializers.PatientsSerializer
    queryset = Patient.objects.all()
    authentication_classes = (TokenAuthentication,)
    filter_backends = (filters.SearchFilter,)
    permission_classes = (IsAuthenticated,)
    search_fields = ("first_name", "last_name", "phone", "email",)

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)


class EmbroApiView(viewsets.ModelViewSet):
    """Handles Creating, reading and updating Patients"""

    serializer_class = serializers.EmbryoSerializer
    queryset = Embryo.objects.all()
    authentication_classes = (TokenAuthentication,)
    filter_backends = (filters.SearchFilter,)
    permission_classes = (IsAuthenticated,)
    search_fields = ("code_name", "karyotype", "sex", "down_syndrome",)

    def perform_create(self, serializer):
        serializer.save(patient__id=self.kwargs['pk'])

下面是我的serializers.py

class PatientsSerializer(serializers.ModelSerializer):
    """A serializer for the patients model."""

    class Meta:
        model = Patient
        fields = ("id", "first_name", "last_name", "phone", "email")

    def create(self, validated_data):
        """Create and return a new patient"""

        patient = Patient(
            first_name=validated_data["first_name"],
            last_name=validated_data["last_name"],
            phone=validated_data["phone"],
            email=validated_data["email"]
        )
        patient.save()
        return patient


class EmbryoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Embryo
        fields = ("id", "patient", "code_name", "karyotype", "down_syndrome", "sex")

        def create(self, validated_data):
            """Create and return a new embryo"""

            embryo = Embryo(
                code_name=validated_data["code_name"],
                karyotype=validated_data["karyotype"],
                down_syndrome=validated_data["down_syndrome"],
                sex=validated_data["sex"]
            )
            embryo.save()
            return embryo

我做错了什么?

下面是@Håken Lid 请求的回溯

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/patient/

Django Version: 2.1.2
Python Version: 3.6.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'rest_framework.authtoken',
 'patients']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
  85.                 return self.cursor.execute(sql, params)

The above exception (null value in column "user_id" violates not-null constraint
DETAIL:  Failing row contains (4, Samir, Tendulkar, 2012795973, 2018-11-04 13:17:02.923723+00, 2018-11-04 13:17:02.923802+00, <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6a190b07040301355b58595e5f2a02051e070b030644090507" rel="noreferrer noopener nofollow">[email protected]</a>, null).
) was the direct cause of the following exception:

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/rest_framework/viewsets.py" in view
  116.             return self.dispatch(request, *args, **kwargs)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  495.             response = self.handle_exception(exc)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
  455.             self.raise_uncaught_exception(exc)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  492.             response = handler(request, *args, **kwargs)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/rest_framework/mixins.py" in create
  21.         self.perform_create(serializer)

File "/home/samir/PycharmProjects/genomic_prediction/src/genomic_project/patients/views.py" in perform_create
  51.         serializer.save(user=self.request.user)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/rest_framework/serializers.py" in save
  214.             self.instance = self.create(validated_data)

File "/home/samir/PycharmProjects/genomic_prediction/src/genomic_project/patients/serializers.py" in create
  21.         patient.save()

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/models/base.py" in save
  718.                        force_update=force_update, update_fields=update_fields)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/models/base.py" in save_base
  748.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/models/base.py" in _save_table
  831.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/models/base.py" in _do_insert
  869.                                using=using, raw=raw)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/models/query.py" in _insert
  1136.         return query.get_compiler(using=using).execute_sql(return_id)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/models/sql/compiler.py" in execute_sql
  1289.                 cursor.execute(sql, params)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/backends/utils.py" in execute
  100.             return super().execute(sql, params)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/backends/utils.py" in execute
  68.         return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute_with_wrappers
  77.         return executor(sql, params, many, context)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
  85.                 return self.cursor.execute(sql, params)

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/utils.py" in __exit__
  89.                 raise dj_exc_value.with_traceback(traceback) from exc_value

File "/home/samir/PycharmProjects/GenomeVenv/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
  85.                 return self.cursor.execute(sql, params)

Exception Type: IntegrityError at /patient/
Exception Value: null value in column "user_id" violates not-null constraint
DETAIL:  Failing row contains (4, Samir, Tendulkar, 2012795973, 2018-11-04 13:17:02.923723+00, 2018-11-04 13:17:02.923802+00, <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="344755595a5d5f6b0506070001745c5b4059555d581a575b59" rel="noreferrer noopener nofollow">[email protected]</a>, null).

我将用户添加到序列化器中,请参见下图并删除了下面的代码,但错误仍然相同

def perform_create(self, serializer):
        serializer.save(user=self.request.user)

enter image description here

Views

enter image description here

最佳答案

您的 PatientsSerializer.create 方法会丢弃序列化器输入数据中的 user 字段。

def create(self, validated_data):
    """Create and return a new patient"""

    patient = Patient(
        first_name=validated_data["first_name"],
        last_name=validated_data["last_name"],
        phone=validated_data["phone"],
        email=validated_data["email"]
        # you need a `user` as well.
    )
    patient.save()
    return patient

目前还不清楚为什么你有一个自定义的创建方法。您是否尝试过将其从序列化器中简单地删除?默认的 ModelSerializer.create 方法使用整个 validated_data 字典。只需将 user 添加到 PatientsSerializer.Meta.fields

class PatientsSerializer(serializers.ModelSerializer):
    """A serializer for the patients model."""

    class Meta:
        model = Patient
        fields = ("id", "user", "first_name", "last_name", "phone", "email")

关于django - 完整性错误: null value in column "user_id" violates not-null constraint (Django Rest Framework),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53142827/

相关文章:

django - 如何在模板中引用用户外键?

Django ORM "get"转换为 SQL

python - 让 zmq 服务器在 Django 中永远运行?

python - 使用滚动背景时按住空格键或向下键后 Sprite 会消失

python - pip 3 : bad interpreter: No such file or directory

Python 3 : "TypeError: cannot astype a datetimelike from [datetime64[ns]] to [int32]" - Jupyter Notebook

django - 保存前更改表单实例 Django

django - 如何在卖家和产品表之间使用 ManyToManyField 放置产品价格

python - Django.core.exceptions.ImproperlyConfigured : AUTH_USER_MODEL refers to model %s that has not been installed

python - Django 中图像/头像的自定义保存方法 - 如何使用