Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django值错误。模型字段必须是实例_Python_Django - Fatal编程技术网

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]