为什么外键的空字段?

时间:2018-01-19 14:02:45

标签: python django

使用django 1.11

我正在为django帐户项目使用API​​后端。以下是类的示例:

from __future__ import unicode_literals
from django.db import models
from django.utils import timezone
from django.conf import settings
import datetime

class Credit(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    name = models.CharField(max_length=200)
    payment_reference = models.IntegerField()
    amount = models.IntegerField()
    payment_type = models.CharField(max_length=200,default='Paypal')
    country = models.CharField(max_length=200,default='Ireland')
    payment_location = models.CharField(max_length=200,default='On-site')
    date = models.DateTimeField(auto_now_add=True)

标准用户被覆盖在另一个名为profiles的应用程序中,我已将其包含在settings.py中 - 'AUTH_USER_MODEL ='profiles.User'

from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager
from django.utils import timezone
# Create your models here.

class Profile(UserManager):
    def _create_user(self, username, email, password,
                     is_staff, is_superuser, **extra_fields):
        now = timezone.now()
        if not email:
            raise ValueError('The given username must be set')

        email = self.normalize_email(email)
        user = self.model(username=email, email=email,
                          is_staff=is_staff, is_active=True,
                          is_superuser=is_superuser,
                          date_joined=now, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)

        return user

class User(AbstractUser):
    objects = Profile()

当我尝试运行makemigrations时,我被告知我正在尝试将可空字段'user'更改为不可为空而无默认值。如果我引用活跃用户,为什么我需要默认值?我希望外键值活动用户对象。这种方式可以过滤Credit的实例,只显示具有登录用户的外键的那些。

谢谢

1 个答案:

答案 0 :(得分:3)

您被告知您正在尝试更改可空字段' user'在没有默认值的情况下不可为空,因为这正是你所拥有的:

user = models.ForeignKey(settings.AUTH_USER_MODEL)

如果Credit模型存在任何现有行,则您的数据库将无法添加该列,因为您尚未指定默认值且不允许null

为数据库中的所有现有行填充user列后,您可以添加非空约束。

makemigrations脚本允许您在添加null=False列时指定一次性默认值。如果您的表还没有任何行,这可能很有用。