Django 外键 to_field

Posted

技术标签:

【中文标题】Django 外键 to_field【英文标题】:Django Foreign Key to_field 【发布时间】:2015-09-29 20:40:36 【问题描述】:

我有 2 个模型 CustomUserMagazine 带有随机/独特的 slug 字段。现在我想用 slug 字段的外键创建第三个模型(文章):

class CustomUser(AbstractBaseUser):
    slug = RandomSlugField(length=6, unique=True)
    ...

class Magazine(models.Model):
    slug = RandomSlugField(length=6, unique=True)
    name = models.CharField()

class Article(models.Model):
    magazine = models.ForeignKey(Magazine, to_field='slug')
    author = models.ForeignKey(settings.AUTH_USER_MODEL, to_field='slug')

但是当我迁移数据库以创建 Article 模型时,出现以下错误:

django.core.exceptions.FieldDoesNotExist: CustomUser has no field named 'slug'

但 CustomUser 显然有一个名为“slug”的字段。

对于 Magazine 模型,我没有收到此错误。 有谁知道出了什么问题?

我将此包用于 slug 字段: https://github.com/mkrjhnsn/django-randomslugfield

编辑: 这是完整的 CustomUser 模型:

class CustomUser(AbstractBaseUser, PermissionsMixin):
    slug = RandomSlugField(length=6, exclude_upper=True)
    username = models.CharField(
        _('username'), max_length=30,
        help_text=_('Required. 30 characters or fewer.'
                'Letters, digits and '
                '@/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(r'^[\w.@+-]+$',
                                  _('Enter a valid username.'), 'invalid')
        ])
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)

    # email is our unique field for authentication
    email = models.EmailField(_('email address'), unique=True)

    is_staff = models.BooleanField(
        _('staff status'), default=False,
        help_text=_('Designates whether the user can log '
                    'into this admin site.')
        )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_('Designates whether this user should be treated as '
                    'active. Unselect this instead of deleting accounts.')
        )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    profile = models.OneToOneField('UserProfile', blank=True, null=True,
                               related_name='user_profile')

    image = models.ImageField(default='images/noimage.jpg',
                          upload_to=settings.PROFILE_IMAGE_PATH,
                          max_length=255)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

【问题讨论】:

显而易见的问题 - 我假设 AUTH_USER_MODEL 指向 CustomUser 是的 :) 我的设置文件中有AUTH_USER_MODEL = 'custom_auth.CustomUser' 您之前是否完成了必要的迁移以将slug 字段添加到CustomUser 模型? ...可能是在迁移中,用户模型仍处于旧状态 是的,CustomUser 模型的slug 字段已经在数据库中。我已经用它来查询了 尝试使用get_usel_modeldocs.djangoproject.com/en/1.8/topics/auth/customizing/… 【参考方案1】:

删除数据库,除了 init 之外的所有迁移并尝试一下

【讨论】:

只需删除整个迁移文件夹

以上是关于Django 外键 to_field的主要内容,如果未能解决你的问题,请参考以下文章

Django学习手册 - ORM 外键

Django--ORM 多表查询

Django的外键创建

Django模型层(多表操作)

Django2.0 models中的on_delete参数

django on_delete属性