标签: django-queryset

在 django 中将 ValuesQuerySet 对象序列化为 json 时出现问题

我无法将 ValuesQuerySet 对象序列化为 json 数据,i\xc2\xb4ve 找到了解决此差距的多种解决方案,但这种情况有所不同,因为我需要遵循外键值。

\n\n
from task_manager.models import UserTasks\ndata=UserTasks.objects.filter(user__username="root",server_id=2).values("server_id__mnemonic")\n
Run Code Online (Sandbox Code Playgroud)\n\n

前面的查询返回类似这样的内容:

\n\n
>>> print data\n[{\'server_id__mnemonic\': u\'lol\'}, {\'server_id__mnemonic\': u\'lol\'}, {\'server_id__mnemonic\': u\'lol\'},.......]\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是当我尝试将其序列化为 JSON 格式时,会引发下一个异常:

\n\n
>>> json_data = serializers.serialize(\'json\',data)\nTraceback (most recent call last):\n  File "<console>", line 1, in <module>\n  File "C:\\Python27\\lib\\site-packages\\django\\core\\serializers\\__init__.py", line 122, in serialize\n    s.serialize(queryset, **options)\n  File "C:\\Python27\\lib\\site-packages\\django\\core\\serializers\\base.py", line 45, in serialize\n    concrete_model = obj._meta.concrete_model\nAttributeError: \'dict\' object has no attribute \'_meta\'\n>>> type(data)\n<class \'django.db.models.query.ValuesQuerySet\'>\n
Run Code Online (Sandbox Code Playgroud)\n\n

I\xc2\xb4ve 在 Django 官方手册中找到了一个解决方案如果您只想序列化字段的子集,则可以为序列化器指定一个 fields 参数:

\n\n
from django.core import …
Run Code Online (Sandbox Code Playgroud)

django json django-models django-queryset django-serializer

1
推荐指数
1
解决办法
2254
查看次数

Django 查询集不返回不同的值

我有一个查询,由于某种原因,即使我指定了不同的值,也不会返回不同的值,我认为这可能是因为唯一,所以我删除了它,但列表仍然相同

circuit_providers =  CircuitInfoData.objects.only('provider').values('provider').distinct()
Run Code Online (Sandbox Code Playgroud)

我只想要一份独特的提供商列表

模型.py

from __future__ import unicode_literals
from django.db import models
import string
import random
import time
import os

# Create your models here.
from service.models import ServiceContacts

def site_photos_path(instance, filename):
    file ,extension = os.path.splitext(filename)
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    chars=string.ascii_uppercase + string.digits
    random_string = ''.join(random.choice(chars) for _ in range(6))
    filename = '%s-%s%s' % (random_string,time.strftime("%d-%m-%H-%M-%S"),extension)
    return 'site_photos/{0}'.format(filename)

def service_upload_path(instance, filename):
    file ,extension = os.path.splitext(filename)
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    chars=string.ascii_uppercase + string.digits
    random_string …
Run Code Online (Sandbox Code Playgroud)

sqlite django django-queryset

1
推荐指数
1
解决办法
6378
查看次数

Django 中的 Defer() 查询集不起作用

我正在尝试向我的数据库发出查询集请求,我希望从响应中排除整个列,在本例中为列权重。但响应正在返回数据库中的所有列。我正在尝试使用延迟,但它不起作用。

我做错了什么?

视图.py

def product_table(request):
   width = request.GET['width']
   length = request.GET['length']
   prod_filter = Product.objects.filter(length=length,width=width).defer('weigth')
   data_prod =serializers.serialize('json', prod_filter)
   return JsonResponse({'data_prod':data_prod})
Run Code Online (Sandbox Code Playgroud)

网页

    ... 
    <div>
        <table id="id_prod" class="table table-striped table-bordered table-hover"></table>
    </div>
    <script>
        $(document).ready(function(){
          ...
                $.get('{% url "prod_table" %}',function (data_prod) {
                    var data_json = JSON.parse(data_prod['data_prod']);
                    var data_array = [];
                    for(var i = 0; i < data_json.length; i++) {
                        var arr = $.map(data_json[i]['fields'], function(el) { return el });
                        data_array.push(arr);
                    }


                    $('#id_prod').DataTable({
                        destroy: true,
                        data: data_array,
                        columns: [
                            { title: "Name" },
                            { title: "width" …
Run Code Online (Sandbox Code Playgroud)

django django-queryset

1
推荐指数
1
解决办法
3562
查看次数

为什么 QuerySet 迭代这么慢?

我正在尝试为系统创建准确且高效的搜索算法。我安装了 Postgresql 来利用它的三元组相似性查询,这就是我搜索对象的方式:

objects_found = Question.objects.extra(where=["CHAR_LENGTH(answer) > 300"])).filter(question__trigram_similar=message
Run Code Online (Sandbox Code Playgroud)

这速度快得令人难以置信,执行大部分查询只用了不到 0.5 秒的时间。查询集的所有对象objects_found都与查询文本相似,但我需要找出最相似的一个。

我知道在这种情况下有两种非常好的算法,第一个是余弦相似度,第二个是Ratcliff/Obershelp 模式识别它在 Python 中有内置实现)。

我尝试进行一次迭代,对它们中的每一个进行测试,在大多数情况下,余弦相似度大约快 1.5 倍(正如预期的那样,考虑到向量的测量速度要快得多),但 SequenceMatcher 会给出更准确的结果。所以我还是选择了SequenceMatcher。请注意,这次迭代花了很长时间。

最后,我尝试在代码中实现SequenceMatcher:

objects_found = (Question.objects.extra(where=["CHAR_LENGTH(answer) > 300"])).filter(question__trigram_similar=message).iterator()
zsim = ("", 0)
for i in objects_found:
    rsim = _search.ratcliff_obershelp(querytext, i.question)
    if zsim[1] < rsim:
       zsim = (i.answer, rsim)
       if rsim > 0.75:  # works in most of the cases
            break
response = zsim[0]
Run Code Online (Sandbox Code Playgroud)

数据库中有约 1GB 的约 500 万行,postgresql 需要不到 0.5 秒的时间来选择具有三元相似性的正确行。在大约 500 万行中,只有 10-90 …

python django postgresql django-queryset

1
推荐指数
1
解决办法
1486
查看次数

使用可变数量的参数过滤多个 Django 模型字段

我正在实现搜索功能,并可以选择通过匹配多个表和这些表中的多个字段来查找记录。

Customer假设我想通过他/她的名字或姓氏,或者通过存储Order在与 不同模型中的放置 ID 来查找Customer。我已经实现的简单场景是用户仅在搜索字段中输入单个单词,然后我使用 Django使用直接字段引用或类似引用Q来查询模型:Orderrelated_query_name

result = Order.objects.filter(
        Q(customer__first_name__icontains=user_input)
        |Q(customer__last_name__icontains=user_input)
        |Q(order_id__icontains=user_input)
        ).distinct()
Run Code Online (Sandbox Code Playgroud)

小菜一碟,完全没有问题。

但是,如果用户想要缩小搜索范围并在搜索字段中输入多个单词该怎么办?

示例:用户输入Bruce并通过搜索返回大量记录。

现在他/她想要更具体,并将客户的姓氏添加到搜索中。因此Bruce Wayne,在将其分成我拥有的单独部分之后,搜索Bruce变为 和Wayne。显然,我不想搜索Orders模型,因为order_id它是一个单词实例,并且足以立即找到客户,因此对于这种情况,我完全将其从查询中删除。

现在我试图通过名字和姓氏来匹配客户,我还想处理提供数据的顺序是随机的情况,以正确处理Bruce WayneWayne Bruce,这意味着我仍然有客户的全名,但名字和姓氏的位置名字不固定。

这就是我正在寻找答案的问题:如何构建查询来搜索模型的多个字段,而不知道哪些搜索词属于哪个表。

我猜这个解决方案很简单,并且肯定有一种优雅的方法来创建这样的动态查询,但我想不出一种方法。

django django-queryset django-q

1
推荐指数
1
解决办法
1911
查看次数

如何在 Django 中编写 sql COALESCE

我是 Django 的新手。如何将 COALESCE sql 查询集写入 django orm。

query = 'SELECT COALESCE(max(CAST(order_no as UNSIGNED)), 0) as o,id from nanossc_Sales_master'
Run Code Online (Sandbox Code Playgroud)

模型.py

class Sales_master(models.Model):
    slno = models.IntegerField(blank=True, null=True)
    order_no = models.CharField(max_length=50, blank=True, null=True)
    type = models.CharField(max_length=50, blank=True, null=True)
    customer_id = models.CharField(max_length=50, blank=True, null=True)
    customer_name = models.CharField(max_length=50, blank=True, null=True)
    brand_name = models.CharField(max_length=50, blank=True, null=True)
    name = models.CharField(max_length=50, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

django django-queryset

1
推荐指数
1
解决办法
3776
查看次数

有没有办法用非表达式注释 django 查询?

我有我需要得到所有对象,其中使用案例existing_field是开始some string

some string 动态变化,所以我需要一种聪明的方法来过滤掉对象。

我的想法是像这样创建带注释的查询:

MyModel.objects.annotate(annotated_field='some string').filter(annotated_field__startswith=F('existing_field'))
Run Code Online (Sandbox Code Playgroud)

目前它失败了: QuerySet.annotate() received non-expression(s): some string

有没有办法用字符串值注释对象?

django django-queryset django-annotate

1
推荐指数
1
解决办法
2066
查看次数

Django - 如何检查 django 是否针对特定查询访问数据库

我想优化 django 应用程序,为此我想知道如何检查我的查询是否正在访问数据库,或者我是否从缓存版本中获取结果/返回值?

例如:

products = Products.objects.filter(product_name__icontains="natural")

if not products.exist():
    return Response(...)

total_products = products.count()
first_product = product.first()
Run Code Online (Sandbox Code Playgroud)

我喜欢在 shell 中执行它,并想检查哪一行访问了数据库,哪一行只从缓存版本返回结果,以便我可以在我的视图中编写优化的查询。

我知道 django-toolbar 但我找不到它是否支持这样的东西(某些行命中数据库或结果是否来自缓存版本)。

问候。

python django django-queryset django-debug-toolbar django-rest-framework

1
推荐指数
1
解决办法
981
查看次数

Django - 查询每个不同状态的计数

我有一个ModelModel.status字段的模型。该status字段可以是值draftactivecancelled

是否可以根据对象的状态获取所有对象的计数?我更愿意在一个查询中做到这一点,而不是这样:

Model.objects.filter(status='draft').count()
Model.objects.filter(status='active').count()
Model.objects.filter(status='cancelled').count()
Run Code Online (Sandbox Code Playgroud)

我认为这aggregate会有所帮助。

django postgresql django-orm django-queryset django-aggregation

1
推荐指数
1
解决办法
70
查看次数

什么是 queryset = super().get_queryset()?

这两段代码是一样的

class PostDetail(generic.DetailView):
    model = models.Post

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(.........)
Run Code Online (Sandbox Code Playgroud)

class PostDetail(generic.DetailView):
    model = models.Post

    def get_queryset(self):
        return post.filter(.........)
Run Code Online (Sandbox Code Playgroud)

这条线实际上是做queryset = super().get_queryset()什么的,如果没有这条线会发生什么?

django django-queryset django-views django-rest-framework

1
推荐指数
1
解决办法
528
查看次数