Django Rest Framework - 列'brith_date'不能为null(当它不是时)

时间:2017-06-29 21:48:30

标签: python django serialization django-rest-framework

发布到我的api创建用户时出现以下错误:

postman integrity error

我正在使用以下功能:

def create(self, validated_data):
        user_data = validated_data.pop('user')
        print(validated_data)
        user = User.objects.create(**user_data)
        validated_data.user_id = user.id
        print(validated_data)
        profile = Profile.objects.create(**validated_data)
        return profile

我的用户创建完美,但在我尝试创建个人资料时出现错误。

validated_data在用户弹出后包含以下内容:

{'phone': '81156598', 'birth_date': datetime.date(2017, 6, 29)}

我之后添加了创建的用户的user_id并将其传递到我的Profile.objects.create(**validated_data)但我得到的birth_date不能为null错误。我是否需要从帖子中获取所有日期格式,然后将其发送回validated_data?不应该有另一种方式吗?

谢谢

修改

这是个人资料模型

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):

    phone = models.CharField(max_length=255, blank=False)
    birth_date = models.DateField(blank=False)
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    @receiver(post_save, sender=User)
    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            Profile.objects.create(user=instance)

    @receiver(post_save, sender=User)
    def save_user_profile(sender, instance, **kwargs):
        instance.profile.save()

    def __str__(self):
        return "{}".format(self.user.username)

1 个答案:

答案 0 :(得分:1)

错误在这里:

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

创建用户后使用信号创建配置文件,创建配置文件实例时,您没有通过var birth_day(null = False),那么当您创建用户时不会出现错误在birth_date = models.DateField(null=True,blank=False)中创建个人资料时,创建个人资料。birth_day或将datetime.now()设置为create_user_profile。 并且您可以在配置文件中更改创建,当您创建用户时,create_user_profile将创建配置文件,您需要在创建手册之前检查用户是否有配置文件。