Python Django值错误。模型字段必须是实例
我在测试地址模型时出错。假设该用户在获得账单之前输入地址信息,但它会产生一个值错误,该错误表示地址模型中的账单字段必须是账单模型的实例。这不应该是因为我已经通过外键将计费模型与地址模型相关联 为清楚起见,此处列出了实际型号的名称:Python Django值错误。模型字段必须是实例,python,django,Python,Django,我在测试地址模型时出错。假设该用户在获得账单之前输入地址信息,但它会产生一个值错误,该错误表示地址模型中的账单字段必须是账单模型的实例。这不应该是因为我已经通过外键将计费模型与地址模型相关联 为清楚起见,此处列出了实际型号的名称: BillingProfile和地址 以下是产生的错误: ValueError at /cart/checkout/address/create Cannot assign "(<BillingProfile: romeo@gmail.com>, Fals
BillingProfile
和地址
以下是产生的错误:
ValueError at /cart/checkout/address/create
Cannot assign "(<BillingProfile: romeo@gmail.com>, False)": "Address.billing_profile" must be a "BillingProfile" instance.
以下是地址和计费模式。
地址:
账单
from django.db import models
from django.conf import settings
from django.db.models.signals import post_save
from accounts.models import Guest
User = settings.AUTH_USER_MODEL
class BillingProfileManager(models.Manager):
def new_or_get(self, request):
user = request.user
guest_email_id = request.session.get('guest_email_id')
obj = None
created = False
# Logged in user checkout. Remembers payment
if user.is_authenticated:
obj,created = self.model.objects.get_or_create(user=user, email=user.email)
# Guest user checkout. autoreloads payment
elif guest_email_id is not None:
guest_obj = Guest
guest_email_obj = guest_obj.objects.get(id=guest_email_id)
obj,created = self.model.objects.get_or_create(email=guest_email_obj.email)
created = True
else:
created = False
return obj, created
class BillingProfile(models.Model):
user = models.OneToOneField(User, unique=True, null=True, blank=True, on_delete=models.DO_NOTHING)
email = models.EmailField()
active = models.BooleanField(default=True)
update = models.DateField(auto_now=True)
timestamp = models.DateField(auto_now_add=True)
objects = BillingProfileManager()
def __str__(self):
return self.email
def user_created_reciever(sender, instance, created, *args, **kwargs):
if created and instance.email:
BillingProfile.objects.get_or_create(user=instance, email=instance.email)
post_save.connect(user_created_reciever, sender=User)
您的代码很好,需要简单的修复<代码>对象。新建或获取()返回一个包含对象和布尔值的元组。在您的情况下,
(,False)
。布尔值指示值是否是新创建的
通过获取元组的第一个元素来修复它:
billing_profile = BillingProfile.objects.new_or_get(request)[0]
是的,它现在有意义了,它确实返回了对象和布尔值的元组。谢谢你的帮助@发动机
from django.db import models
from django.conf import settings
from django.db.models.signals import post_save
from accounts.models import Guest
User = settings.AUTH_USER_MODEL
class BillingProfileManager(models.Manager):
def new_or_get(self, request):
user = request.user
guest_email_id = request.session.get('guest_email_id')
obj = None
created = False
# Logged in user checkout. Remembers payment
if user.is_authenticated:
obj,created = self.model.objects.get_or_create(user=user, email=user.email)
# Guest user checkout. autoreloads payment
elif guest_email_id is not None:
guest_obj = Guest
guest_email_obj = guest_obj.objects.get(id=guest_email_id)
obj,created = self.model.objects.get_or_create(email=guest_email_obj.email)
created = True
else:
created = False
return obj, created
class BillingProfile(models.Model):
user = models.OneToOneField(User, unique=True, null=True, blank=True, on_delete=models.DO_NOTHING)
email = models.EmailField()
active = models.BooleanField(default=True)
update = models.DateField(auto_now=True)
timestamp = models.DateField(auto_now_add=True)
objects = BillingProfileManager()
def __str__(self):
return self.email
def user_created_reciever(sender, instance, created, *args, **kwargs):
if created and instance.email:
BillingProfile.objects.get_or_create(user=instance, email=instance.email)
post_save.connect(user_created_reciever, sender=User)
billing_profile = BillingProfile.objects.new_or_get(request)[0]