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”然后就报错了
我刚刚在这个问题中提到了上述设置,但如果需要更多代码,请告诉我我会用这些信息更新我的问题。谢谢
您的 OneToOneField
从 django.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
我遇到了这个错误。
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”然后就报错了
我刚刚在这个问题中提到了上述设置,但如果需要更多代码,请告诉我我会用这些信息更新我的问题。谢谢
您的 OneToOneField
从 django.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