字段定义与模型“auth.User”的关系,该关系已被换出(fields.E301)

问题描述

我收到此错误

错误:subscriptions.StripeCustomer.user:(fields.E301) 字段定义 与模型“auth.User”的关系,该模型已被换出。 提示:更新关系以指向“settings.AUTH_USER_MODEL”。

我正在尝试按照本手册 https://testdriven.io/blog/django-stripe-subscriptions/

配置 Django Stripe 订阅

我的模型.py

from django.contrib.auth.models import User
from django.db import models


class StripeCustomer(models.Model):
    user = models.OnetoOneField(to=User,on_delete=models.CASCADE)
    stripeCustomerId = models.CharField(max_length=255)
    stripeSubscriptionId = models.CharField(max_length=255)

    def __str__(self):
        return self.user.username

我的 admin.py

from django.contrib import admin
from subscriptions.models import StripeCustomer


admin.site.register(StripeCustomer)

我的settings.py

#used for django-allauth
AUTH_USER_MODEL = 'accounts.CustomUser'

DEFAULT_AUTO_FIELD='django.db.models.AutoField'

SITE_ID = 1

AUTHENTICATION_BACKENDS = (
    'allauth.account.auth_backends.AuthenticationBackend','django.contrib.auth.backends.ModelBackend',)

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
ACCOUNT_EMAIL_VERIFICATION = "none"

帐户/模型.py

from django.contrib.auth.models import AbstractUser


class CustomUser(AbstractUser):

    class Meta:
        verbose_name_plural = 'CustomUser'

上面设置后,我执行了“python manage.py makemigrations && python manage.py migrate”,然后出现了错误

我刚刚在这个问题中提到了上述设置,但如果需要更多代码,请告诉我我会用该信息更新我的问题。谢谢

解决方法

您的 OneToOneField 指向 User 中的 django.contrib.auth 模型,而实际上您使用的是自定义用户模型 CustomUser,因此您会收到错误消息。通常,如果您想拥有一个外键或任何与用户模型相关的字段,则应将其指向 settings.AUTH_USER_MODEL,如 Referencing the User model [Django docs] 中所述,以便可以轻松防止此类问题。因此,像这样更改您的 StripeCustomer 模型:

from django.conf import settings
from django.db import models


class StripeCustomer(models.Model):
    user = models.OneToOneField(to=settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    stripeCustomerId = models.CharField(max_length=255)
    stripeSubscriptionId = models.CharField(max_length=255)

    def __str__(self):
        return self.user.username