繁体   English   中英

django ForeignKey with Choices - 设置默认值

[英]django ForeignKey with Choices - setting default value

我有一个会员资格 model,有三个选择。 我在成员资格 model 中设置了这些选项的默认值。 但是,我有一个用户 model 与成员资格 model 有 ForeignKey 关系,当我尝试设置 default='Personal' 时,我得到一个 ValueError。

ValueError:字段“id”需要一个数字,但得到“个人”。

模型.py

MEMBERSHIP_CHOICES = (
    ('Enterprise', 'enterprise'),
    ('Premium', 'premium'),
    ('Personal', 'personal'),
)

class Membership(models.Model):
    slug = models.SlugField()
    membership_type = models.CharField(
        choices=MEMBERSHIP_CHOICES,
        default='Personal',
        max_length=30)
    annual_monthly_price = models.DecimalField(max_digits=5, decimal_places=2)
    monthly_monthly_price = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return self.membership_type

class CustomUser(AbstractUser):
    username = None
    first_name = models.CharField(max_length=255, unique=False, verbose_name='first name')
    last_name = models.CharField(max_length=255, unique=False, verbose_name='last name')
    email = models.EmailField(max_length=255, unique=True)
    user_team = models.ForeignKey('Team', on_delete=models.SET_NULL, null=True, blank=True, related_name='userteam')
    team_leader = models.BooleanField(default=False)
    team_member = models.BooleanField(default=False)
    user_tasks = models.ManyToManyField('Task', through='UserTasks')

    # user types
    membership_type = models.ForeignKey(Membership, on_delete=models.SET_DEFAULT, default='Personal')

    # Abstract User fields
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)

我试过清除迁移并删除数据库。 我让它工作的唯一方法是使用:

on_delete=models.SET_NULL, null=True

在 CustomUser 的 members_type model 字段内,但我希望用户在注册时默认为“个人”。

我认为您遇到的错误是因为您尚未在Membership model 中定义主键。 因此 Django 正在为您执行此操作,并使用一个数字的AutoField

尝试更改您的会员资格 model 以将membership_type类型作为主键,即

membership_type = models.CharField(
        primary_key=True,
        choices=MEMBERSHIP_CHOICES,
        default='Personal',
    max_length=30)

假设membership_type 是一个唯一字段,一种可能的方法是:

#models.py

class Membership(models.Model):
    membership_type = models.CharField(
        choices=MEMBERSHIP_CHOICES,
        default='Personal',
        unique=True,
        max_length=30)
    ....


class CustomUser(AbstractUser):
   ....
   membership_type = models.ForeignKey(Membership, on_delete=models.SET_DEFAULT, to_field='membership_type', default='Personal')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM