Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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 如何使用Q对象查询django模型中的float/int值或字符串?_Python_Django_Python 2.7_Django 1.8_Django Q - Fatal编程技术网

Python 如何使用Q对象查询django模型中的float/int值或字符串?

Python 如何使用Q对象查询django模型中的float/int值或字符串?,python,django,python-2.7,django-1.8,django-q,Python,Django,Python 2.7,Django 1.8,Django Q,Django版本=1.8,IDE=pycharm,python 2.7 我有一个搜索表单,我想根据匹配产品名称、产品描述或产品价格的字符串在模型中搜索和列出项目(“产品”) 下面是我在views.py中的“searchitems”部分。此外,我还不清楚下面这行在get_queryset函数中做了什么。干杯 qs = super(ProductListView, self).get_queryset(*args,**kwargs) # 下面是models.py from djang

Django版本=1.8,IDE=pycharm,python 2.7

我有一个搜索表单,我想根据匹配产品名称、产品描述或产品价格的字符串在模型中搜索和列出项目(“产品”)

下面是我在views.py中的“searchitems”部分。此外,我还不清楚下面这行在get_queryset函数中做了什么。干杯

   qs = super(ProductListView, self).get_queryset(*args,**kwargs)
#

下面是models.py

    from django.db import models
    from django.core.urlresolvers import reverse
    from django.db.models.signals import post_save
    from django.utils.text import slugify

    # Create your models here.

    class ProductQuerySet(models.query.QuerySet):
        def active(self):
            return self.filter(active=True)


    class ProductManager(models.Manager):
        def get_queryset(self):
            return ProductQuerySet(self.model, using=self.db)

        def all(self, *args, **kwargs):
            return self.get_queryset().active()


    class Product(models.Model):
        title = models.CharField(max_length=120)
        description = models.TextField(blank=True, null=True)
        price = models.DecimalField(decimal_places=2, max_digits=10)
        active = models.BooleanField(default=True)
        objects = ProductManager()

        def __unicode__(self):
            return self.title

        def get_absolute_url(self):
            return reverse("product_detail", kwargs={"pk": self.pk})
            # OR use this- return "/product/%s"%(self.pk)


    class Variation(models.Model):
        product = models.ForeignKey(Product)  ##this means each Variation is related to single product
        title = models.CharField(max_length=120)
        price = models.DecimalField(decimal_places=2, max_digits=10)
        sale_price = models.DecimalField(decimal_places=2, max_digits=10, null=True, blank=True)
        active = models.BooleanField(default=True)
        inventory = models.IntegerField(null=True, blank=True)  # default=-1 means unlimited

        def __unicode__(self):
            return self.title

        def get_price(self):
            if self.sale_price is not None:
                return self.sale_price
            else:
                return self.price

        def get_absolute_url(self):
            return self.product.get_absolute_url()


    # for post save receiver


    def product_saved_receiver(sender, instance, created, *args, **kwargs):
        # sender=modelclass, instance=actual instance being saved,created=boolean true if record was created
        product = instance
        variations = product.variation_set.all()
        if variations.count() == 0:
            new_var = Variation()
            new_var.product = product
            new_var.title = "Default"
            new_var.price = product.price
            new_var.save()

    post_save.connect(product_saved_receiver, sender=Product)


    # product image
    # you need to install python pillow library to support.


    # it checks if file uploaded is actually an image and checks extension
    # class ProductImage(models.Model):
    #     product = models.ForeignKey(Product)
    #     image = models.ImageField(upload_to='products/') #image will be uploaded to media/mediaroot/products
    #
    #     def __unicode__(self):
    #         return self.product.title

    #slugify
    def image_upload_to(instance, filename):
        title = instance.product.title
        slug = slugify(title)
        file_extension = filename.split(".")[1]
        # or  basename,file_extension = filename.split(".")
        new_filename = "%s.%s" %(instance.id,file_extension)
        return "products/%s/%s" %(slug, filename)

    # above function changed for slugfying

    class ProductImage(models.Model):
        product = models.ForeignKey(Product)
        image = models.ImageField(upload_to=image_upload_to) #image will be uploaded to media/mediaroot/products

        def __unicode__(self):
            return self.product.title
使用以上代码,我可以根据价格(如50或67.89)进行搜索和列表,但无法搜索字符串并获得以下错误

克莱普顿和国王一起骑马

ValidationError at /products/

[u"'eric clapton riding with the king' value must be a decimal number."]

Request Method:     GET
Request URL:    http://127.0.0.1:8000/products/?q=eric%20clapton%20riding%20with%20the%20king
Django Version:     1.8.4
Exception Type:     ValidationError
Exception Value:    

[u"'eric clapton riding with the king' value must be a decimal number."]

Exception Location:     C:\Anaconda\lib\site-packages\django\db\models\fields\__init__.py in to_python, line 1602
Python Executable:  C:\Anaconda\python.exe
Python Version:     2.7.10  

既然价格需要一个小数值,我们就应该给它一个小数值。请尝试以下视图:

def get_queryset(self, *args, **kwargs):
    qs = super(ProductListView, self).get_queryset(*args,**kwargs)
    query = self.request.GET.get("q", False)  # provide default value or you get a KeyError
    if query:
        filter_arg = Q(title__icontains=query) | Q(description__icontains=query)
        try:
            filter_arg |= Q(price=float(query))
        except ValueError:
            pass
        qs = self.model.objects.filter(filter_arg)
    return qs
qs=super(ProductListView,self)。获取查询集(*args,**kwargs)
这用于获取视图类的父类提供的查询集
ProductListView
。请在此处查看python类和继承:

filter_arg |=Q(price=float(query))
这用于附加到我们的filter_arg值。这与
filter_arg=filter_arg|Q(price=float(query)


float(查询)
使用此函数,我们试图将查询变量转换为浮点值,并将其放入
try
语句中,因为它可能会给我们一个
ValueError
,在这种情况下
query
值不是
float
,因为价格需要一个十进制值,我们应该为其提供一个十进制值。请尝试以下view:

def get_queryset(self, *args, **kwargs):
    qs = super(ProductListView, self).get_queryset(*args,**kwargs)
    query = self.request.GET.get("q", False)  # provide default value or you get a KeyError
    if query:
        filter_arg = Q(title__icontains=query) | Q(description__icontains=query)
        try:
            filter_arg |= Q(price=float(query))
        except ValueError:
            pass
        qs = self.model.objects.filter(filter_arg)
    return qs
qs=super(ProductListView,self)。获取查询集(*args,**kwargs)
这用于获取视图类的父类提供的查询集
ProductListView
。在此处查看python类和继承:

filter\u arg |=Q(price=float(query))
用于附加到我们的filter\u arg值。它与
filter\u arg=filter\u arg | Q(price=float(query)


float(query)
我们试图将查询变量转换为float,并将其放入
try
语句中,因为它可能会给我们一个
ValueError
在这种情况下
query
值不是
float

谢谢@Bogdan立即起作用。我不知道qs=super是什么(ProductListView,self)。get_-queryset(*args,**kwargs)和filter_-arg |=Q(price=float(query))在这里完成了。你能提供一些更多的信息或链接吗。Gracias:)谢谢@Bogdan,它马上就可以工作了。我不知道qs=super(ProductListView,self)是什么。get_-queryset(*args,**kwargs)和filter|=Q(price=float(query))你能提供更多的信息或链接吗