首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueError不能查询customer1@gmail.com:必须是Customer实例

ValueError不能查询customer1@gmail.com:必须是Customer实例
EN

Stack Overflow用户
提问于 2020-04-05 09:46:23
回答 2查看 324关注 0票数 0

我正在尝试将客户保存到订单模型,但没有保存客户,这表明customer1@gmail.com必须是客户实例。我还想将卖家保存到订单模型中。因为,产品与卖家是相关的。当我订购东西时,在保存订单后,我应该能够看到我从哪个卖家那里购买了该产品。但在这里,我无法拯救卖家。

cart views.py

代码语言:javascript
复制
def checkout(request):
    cart_obj, cart_created = Cart.objects.new_or_get(request)
    order_obj = None
    if cart_created or cart_obj.products.count() == 0:
        return redirect('cart:cart')
    login_form = CustomerLoginForm()
    signin_form = CreateCustomerForm()
    address_form = AddressForm()
    billing_address_id = request.session.get("billing_address_id", None)
    shipping_address_id = request.session.get("shipping_address_id", None)
    billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(request)
    address_qs = None
    if billing_profile is not None:
        if request.user.is_authenticated:
            address_qs = Address.objects.filter(billing_profile=billing_profile)
        order_obj, order_obj_created = Order.objects.new_or_get(billing_profile, cart_obj, request)
        if shipping_address_id:
            order_obj.shipping_address = Address.objects.get(id=shipping_address_id)
            del request.session["shipping_address_id"]
        if billing_address_id:
            order_obj.billing_address = Address.objects.get(id=billing_address_id)
            del request.session["billing_address_id"]

        if billing_address_id or shipping_address_id:
            order_obj.save()
    if request.method == "POST":
        is_done = order_obj.check_done()
        if is_done:
            order_obj.mark_paid()
            request.session['cart_items'] = ""
            del request.session['cart_id']
            return redirect("cart:success")

    context = {
        'object':order_obj,
        'billing_profile':billing_profile,
        'login_form':login_form,
        'signin_form': signin_form,
        'address_form':address_form,
        'address_qs': address_qs,
    }
    return render(request, 'cart/checkout.html', context)

order models.py

代码语言:javascript
复制
class OrderManager(models.Manager):
    def new_or_get(self, billing_profile, cart_obj, request):
        created = False
        qs = self.get_queryset().filter(cart=cart_obj, billing_profile=billing_profile, customer=request.user, active=True, status='created')
        if qs.count() == 1:
            obj = qs.first()
            # if request.user.is_authenticated and obj.customer is None:
            #     obj.customer = request.user
            #     obj.save()
        else:
            obj = self.model.objects.create(billing_profile=billing_profile, customer=request.user, cart=cart_obj)
            # obj = self.model.objects.new(customer=request.user)
            created = True
        return obj, created

    # def new(self, customer=None):
    #     user_obj = None
    #     if customer is not None:
    #         if customer.is_authenticated:
    #             user_obj = customer
    #     return self.model.objects.create(customer=user_obj)

class Order(models.Model):
    order_id = models.CharField(max_length=120, blank=True)

    billing_profile = models.ForeignKey(BillingProfile, blank=True, null=True, on_delete=models.CASCADE)
    shipping_address = models.ForeignKey(Address, related_name="shipping_address", null=True, blank=True, on_delete=models.CASCADE)
    billing_address = models.ForeignKey(Address, related_name="billing_address", null=True, blank=True, on_delete=models.CASCADE)

    shipping_total = models.DecimalField(default=5.99, max_digits=100, decimal_places=2) 
    total = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)

    status = models.CharField(max_length=120, default='created', choices=ORDER_STATUS_CHOICES)
    active = models.BooleanField(default=True)

    cart = models.ForeignKey(Cart, on_delete=models.CASCADE)

    customer = models.ForeignKey(Customer,blank=True, null=True,  on_delete=models.CASCADE)
    seller = models.ForeignKey(Seller, blank=True, null=True, on_delete=models.CASCADE)

    objects = OrderManager()

    def __str__(self):
        return self.order_id

billing models.py

代码语言:javascript
复制
class BillingProfileManager(models.Manager):
    def new_or_get(self, request):
        user = request.user
        created=False
        obj = None
        if user.is_authenticated:
            obj, created = self.model.objects.get_or_create(customer=user, email=user.email)
        else:
            pass
        return obj, created

class BillingProfile(models.Model):
    customer = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    email = models.EmailField()
    active = models.BooleanField(default=True)
    update = models.DateTimeField(auto_now=True)
    timestamp = models.DateTimeField(auto_now_add=True)

    objects = BillingProfileManager()

    def __str__(self):
        return self.email

def user_created_receiver(sender, instance, created, *args, **kwargs):
    if created and instance.email:
        BillingProfile.objects.get_or_create(customer=instance, email=instance.email)

post_save.connect(user_created_receiver, sender=User)

product models.py

代码语言:javascript
复制
class Product(models.Model):
    title               = models.CharField(max_length=120)
    description         = models.TextField(max_length=400)
    categories          = models.CharField(max_length=120, choices=CATEGORIES)
    volume              = models.DecimalField(decimal_places=2,max_digits=10, default=0.00)
    volume_type         = models.CharField(max_length=120, choices=PRODUCT_VOL_TYPE)
    product_stock       = models.IntegerField(default=0.00)
    price               = models.DecimalField(decimal_places=2,max_digits=10, default=0.00)
    image               = models.ImageField(upload_to='products/', null=True, blank=True)
    active              = models.BooleanField(default=True)
    timestamp           = models.DateTimeField(auto_now_add=True)
    slug                = models.SlugField(blank=True, unique=True)

    seller = models.ForeignKey(Seller, on_delete=models.CASCADE)

    objects = ProductManager()

    def __str__(self):
        return self.title

cart views.py中的Errors错误用*表示

代码语言:javascript
复制
billing_profile, billing_profile_created = BillingProfile.objects.new_or_get(request)
    address_qs = None
    if billing_profile is not None:
        if request.user.is_authenticated:
            address_qs = Address.objects.filter(billing_profile=billing_profile)
        ***order_obj, order_obj_created = Order.objects.new_or_get(billing_profile, cart_obj, request)****

order models.py中的Errors

错误用*表示

代码语言:javascript
复制
class OrderManager(models.Manager):
    def new_or_get(self, billing_profile, cart_obj, request):
        created = False
        ******qs = self.get_queryset().filter(cart=cart_obj, billing_profile=billing_profile, customer=request.user, active=True, status='created')******
        if qs.count() == 1:
            obj = qs.first()
            # if request.user.is_authenticated and obj.customer is None:
            #     obj.customer = request.user
            #     obj.save()
        else:
            ****obj = self.model.objects.create(billing_profile=billing_profile, customer=request.user, cart=cart_obj)*****
            # obj = self.model.objects.new(customer=request.user)
            created = True
        return obj, created

accounts models.py

代码语言:javascript
复制
class UserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""

    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        """Create and save a regular User with the given email and password."""
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(email, password, **extra_fields)


class User(AbstractUser):
    """User model."""

    username = None
    email = models.EmailField(_('email address'), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager() ## This is the new line in the User model. ##


class Customer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,  primary_key=True)
    email = models.EmailField(_('email address'), unique=True)
    full_name = models.CharField(max_length=120, null=True, blank=True)
    phone = models.IntegerField(null=True, blank=True)
    profile_pic = models.ImageField(upload_to='profile-image/', default='profile1.png', null=True, blank=True)

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


class Seller(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    email = models.EmailField(_('email address'), unique=True)
    full_name = models.CharField(max_length=120, null=True, blank=True)
    phone = models.IntegerField(null=True, blank=True)
    profile_pic = models.ImageField(upload_to='profile-image/', default='profile1.png', null=True, blank=True)

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

E R R O R

内部服务器错误: /cart/checkout/

回溯(最近一次调用):文件请求行34,在内部响应=get_response( "C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\core\handlers\exception.py",)

文件响应行115,_get_response响应= self.process_exception_by_middleware(e,"C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\core\handlers\base.py",)

文件响应第113行,_get_response响应=wrapped_callback( "C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\core\handlers\base.py",,*callback_args,**callback_kwargs)

文件"C:\Users\debop\OneDrive\Desktop\mondayBS\src\cart\views.py",行70,在检出中

代码语言:javascript
复制
order_obj, order_obj_created = Order.objects.new_or_get(billing_profile, cart_obj, request)

文件"C:\Users\debop\OneDrive\Desktop\mondayBS\src\orders\models.py",第24行,在new_or_get中

代码语言:javascript
复制
qs = self.get_queryset().filter(cart=cart_obj, billing_profile=billing_profile, customer=request.user, active=True, status='created')

filter "C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\db\models\query.py",self._filter_or_exclude(False,*args,**kwargs)中的文件返回行904

_filter_or_exclude clone.query.add_q中的文件"C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\db\models\query.py",行923 (q(*args,**kwargs))

文件"C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\db\models\sql\query.py",第1350行,在add_q子句中,_= self._add_q(q_object,self.used_aliases)

File "C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\db\models\sql\query.py",1377行,在_add_q child_clause中,needed_inner = self.build_filter(

文件"C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\db\models\sql\query.py",行1284,in build_filter self.check_related_objects(join_info.final_field,value,join_info.opts)

文件"C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\db\models\sql\query.py",行1122,在check_related_objects self.check_query_object_type中(值,选项,字段)

File "C:\Users\debop\OneDrive\Desktop\mondayBS\lib\site-packages\django\db\models\sql\query.py",第1103行,在check_query_object_type raise ValueError(

ValueError:无法查询duke@gmail.com:必须是Customer实例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-05 11:24:51

OrderManager中,您需要在customer字段中使用request.user.customer,而不仅仅是用户

代码语言:javascript
复制
def new_or_get(self, billing_profile, cart_obj, request):
    created = False
    qs = self.get_queryset().filter(cart=cart_obj, billing_profile=billing_profile, customer=request.user.customer, active=True, status='created')
    if qs.count() == 1:
        obj = qs.first()
    else:
        obj = self.model.objects.create(billing_profile=billing_profile, customer=request.user.customer, cart=cart_obj)
        created = True
    return obj, created

由于Customer.userOneToOneField,因此您可以使用user.customer从用户访问客户

票数 0
EN

Stack Overflow用户

发布于 2020-04-05 11:46:05

OrderManager中,我将request更改为customer,而在checkout view中,我

添加了一个新的变量customer,并将request.user.customer设置为该变量,然后将其传递给order object,然后它就可以工作了。因为,当我使用request时,显示AttributeError: 'Order' object has no attribute 'request'时出现错误

order manager

代码语言:javascript
复制
def new_or_get(self, billing_profile, cart_obj, customer):
        created = False
        qs = self.get_queryset().filter(cart=cart_obj, billing_profile=billing_profile, customer=customer, active=True, status='created')
        if qs.count() == 1:
            obj = qs.first()
        else:
            obj = self.model.objects.create(billing_profile=billing_profile, customer=customer, cart=cart_obj)
            created = True
        return obj, created

checkout view

代码语言:javascript
复制
customer = request.user.customer
    if billing_profile is not None:
        if request.user.is_authenticated:
            address_qs = Address.objects.filter(billing_profile=billing_profile)
        order_obj, order_obj_created = Order.objects.new_or_get(billing_profile, cart_obj, customer)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61037056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档