Field 定义与模型 'auth.User' 的关系,已被换出。(fields.E301)

Field defines a relation with the model 'auth.User', which has been swapped out.(fields.E301)

我遇到了这个错误。

ERRORS: subscriptions.StripeCustomer.user: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out. HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.

我正尝试按照本手册配置 Django Stripe 订阅 https://testdriven.io/blog/django-stripe-subscriptions/

我的models.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"

accounts/models.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”然后就报错了

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

您的 OneToOneFielddjango.contrib.auth 指向 User 模型,而实际上您使用的是自定义用户模型 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