GVKun编程网logo

django-将列表转换回queryset(列表转json python)

16

本文将为您提供关于django-将列表转换回queryset的详细介绍,我们还将为您解释列表转jsonpython的相关知识,同时,我们还将为您提供关于Django+chart.js:使用Django

本文将为您提供关于django-将列表转换回queryset的详细介绍,我们还将为您解释列表转json python的相关知识,同时,我们还将为您提供关于Django + chart.js:使用Django Queryset数据进行绘图、Django / Python在对象列表中转换的QuerySet数据在Tuple中转换str / int值、django QuerySet、Django QuerySet API的实用信息。

本文目录一览:

django-将列表转换回queryset(列表转json python)

django-将列表转换回queryset(列表转json python)

我有一些记录要根据计算值排序。在这里得到答案…就像这样:

sorted(Profile.objects.all(), key=lambda p: p.reputation)

在像这样的Profile类上:

class Profile(models.Model):    ...    @property    def reputation(self):        ...

不幸的是,通用视图期望有一个queryset对象,如果我给它一个列表,则会抛出一个错误。

有没有一种方法可以返回查询集

要么…

我可以以某种方式将列表转换为查询集吗?在django文档中找不到类似的内容。

我希望不要对数据进行非规范化,但是我想如果需要的话,我会的。

更新/回答:
看来,取回一个查询集的唯一方法是是否可以将所有逻辑都放入sql查询中。

如果不可能,(我认为)你需要对数据进行规范化

答案1

小编典典

将数据列表转换回查询没有任何意义。查询对象从不保存数据。它仅表示对数据库的查询。如果将列表添加到查询中,它将不得不再次获取所有内容,这将是多余的并且在性能方面非常糟糕。

你可以做什么:

  • 描述如何reputation计算该字段;有可能以某种方式对数据库中的数据进行排序。
  • 修改视图以不需要查询对象。如果需要进行其他过滤等操作,则应在进行任何排序之前完成,因为排序将花费更少的时间并具有更少的条目(并且将从数据库中获取的数据更少。)因此,你可以将过滤后的查询对象发送到排序函数在将其发送到模板之前就可以使用(它不在乎是查询还是列表)。

答案2

小编典典

好的…这篇文章现在已经很旧了,但是你可以做的是获取ids列表中的所有对象,然后执行model.objects.filter(pk__in=list_of_ids)

Django + chart.js:使用Django Queryset数据进行绘图

Django + chart.js:使用Django Queryset数据进行绘图

如何解决Django + chart.js:使用Django Queryset数据进行绘图?

我遇到了一个我无法解决的问题。我将查询集数据从django视图传递到其相应的模板,我想使用此数据通过chart.js绘制图形。

我正在尝试不使用Ajax请求来实现这一目标。

但是,当我尝试使用javascript获取queryset数据以将其传递到chart.js时,会出现错误。

这是我在html中所做的:

<div id="default_data">
                      <p>  {{ default_items }} </p>
                 </div>
                 <div id="labels">
                   
                 <p>{{ labels }} </p>
<div>
                      <div id="tag3">{% trans ''ITEMS WITH HIGHEST NUMBER OF SALES (3 MONTHS)'' %}</div>
                <div>
                  <canvas id="myChart3" height="90"></canvas>
                </div>
              </div>

这是labelsdefault_data的呈现方式:

<QuerySet [58.0,62.0,74.0,60.0,16.0,1.0,2.0]>

<QuerySet [''372750'',''372600'',''372650'',''372700'',''372150'',''289807'',''289922'',''289840'',''289923'',''372310'']>

和javascript:

  <script>
       
      
      
              
                    var ctx3 = document.getElementById(''myChart3'').getContext(''2d'');
                    var labels = document.getElementById("labels");
                  

                
                
                var myChart3 = new Chart(ctx3,{
                        type: ''bar'',data: {
                            labels: labels,datasets: [{
                                label:''références avec nombre de ventes élevé'',data: default_data,label: ''# of Votes'',borderWidth: 1,}]
                        },options: {
                                scales: {
                                    yAxes: [{
                                      
                                          ticks: {
                                            beginAtZero: true
                                        }

                                            
                                    }]
                                }
                            
                        }
                    });
      
    </script>

我不明白chrome dev中输出的错误:

Chart.min.js:10 Uncaught TypeError: e.slice is not a function

有人可以解释我如何在不使用ajax请求的情况下在chart.js中传递Django Queryset数据吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Django / Python在对象列表中转换的QuerySet数据在Tuple中转换str / int值

Django / Python在对象列表中转换的QuerySet数据在Tuple中转换str / int值

您已经在这里自己创建了一个元组:

function show_profile_menu() {
    var user_info = document.getElementById("user-nav-info");
    var new_button = document.getElementById("user-nav-new");

    if (user_info.style.visibility === "hidden"){ 
        user_info.style.visibility = "visible";
        user_info.style.display = "block";
    } else{
        user_info.style.display = "none";
        user_info.style.visibility = "hidden";
    }
}   

应为:

        self.id = str(id),self.brand = str(brand),self.name = str(name)

django QuerySet

django QuerySet

  • Django对数据库的封装1——QuerySet
  • 发布时间:2018-02-28 来源:网络 上传者:用户

    关键字: manager 数据库 记录 影响

    发表文章
  • 摘要:   Django对数据库的操作分用到三个类:Manager、QuerySet、Model。Manager的主要功能定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法;QuerySet是Manager的方法返回的,是一个可遍历结构,包含一个或多个元素,每个元素都是一个Model实例,它里面的方法也是表级方法,前面说了,Django给我们提供了增加表级方法的途径
  •     Django对数据库的操作分用到三个类:Manager、QuerySet、Model。Manager的主要功能定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法;QuerySet是Manager的方法返回的,是一个可遍历结构,包含一个或多个元素,每个元素都是一个Model 实例,它里面的方法也是表级方法,前面说了,Django给我们提供了增加表级方法的途径,那就是自定义manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;Model是一条记录的类,它的功能很强大,里面包含外键实体等,它的方法都是记录级方法(都是实例方法,无类方法),不要在里面定义类方法,比如计算记录的总数,查看所有记录,这些应该放在自定义的manager类中。

    1.QuerySet 1.1 简介

    每个Model都有一个默认的manager类,名为objects,QuerySet有两种来源:通过manager的方法得到、通过QuerySet的方法得到。QuerySet的最初来源就是通过manager的方法。mananger的方法和QuerySet的方法大部分同名,同意思,如filter(),update()等,但也有些不同,如manager有create()、get_or_create(),而QuerySet有delete()等。一个QuerySet包含一个或多个model instance。QuerySet类似于Python中的list,list的一些方法QuerySet也有,比如切片,遍历。

 

 

比如models.Author.objects

models.Author就是一个model,他有一个manager类,models.Author.objects ,这个类调用all()方法得到queryset对象

a=models.Author.objects.all()#a就是一个queryset对象

 

 

有些方法,通过manager和通过queryset调用,产生的效果是相同的,比如说filter方法,manager和queryset对象都有这个方法,而且

models.Author.objects.filter(id__gt=2)

models.Author.objects.all().filter(id__gt=2)

调用产生的结果是相同的

Django QuerySet API

Django QuerySet API

从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet。

文中的例子大部分是基于这个 blog/models.py

from django.db import models
 
 
class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()
 
    def __unicode__(self):  # __str__ on Python 3
        return self.name
 
class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()
 
    def __unicode__(self):  # __str__ on Python 3
        return self.name
 
class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()
 
    def __unicode__(self):  # __str__ on Python 3
        return self.headline

1. QuerySet 创建对象的方法

>>> from blog.models import Blog
>>> b = Blog(name=''Beatles Blog'', tagline=''All the latest Beatles news.'')
>>> b.save()
 
总之,一共有四种方法
# 方法 1
Author.objects.create(name="WeizhongTu", email="tuweizhong@163.com")
 
# 方法 2
twz = Author(name="WeizhongTu", email="tuweizhong@163.com")
twz.save()
 
# 方法 3
twz = Author()
twz.name="WeizhongTu"
twz.email="tuweizhong@163.com"
 
# 方法 4,首先尝试获取,不存在就创建,可以防止重复
Author.objects.get_or_create(name="WeizhongTu", email="tuweizhong@163.com")
# 返回值(object, True/False)

备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False


当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来

>>> from blog.models import Entry
>>> entry = Entry.objects.get(pk=1)
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")
>>> entry.blog = cheese_blog
>>> entry.save()

2. 获取对象的方法(上一篇的部分代码)

Person.objects.all() # 查询所有
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引,后面有相应解决办法,第7条
Person.objects.get(name="WeizhongTu") # 名称为 WeizhongTu 的一条,多条会报错
 
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
 
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
 
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
 
# filter是找出满足条件的,当然也有排除符合某条件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的

3. QuerySet 是可迭代的,比如:

es = Entry.objects.all()
for e in es:
    print(e.headline)

Entry.objects.all() 或者 es 就是 QuerySet 是查询所有的 Entry 条目。

注意事项:

(1). 如果只是检查 Entry 中是否有对象,应该用 Entry.objects.all().exists()

(2). QuerySet 支持切片 Entry.objects.all()[:10] 取出10条,可以节省内存

(3). 用 len(es) 可以得到Entry的数量,但是推荐用 Entry.objects.count()来查询数量,后者用的是SQL:SELECT COUNT(*)

(4). list(es) 可以强行将 QuerySet 变成 列表

4. QuerySet 是可以用pickle序列化到硬盘再读取出来的

>>> import pickle
>>> query = pickle.loads(s)     # Assuming ''s'' is the pickled string.
>>> qs = MyModel.objects.all()
>>> qs.query = query            # Restore the original ''query''.

5. QuerySet 查询结果排序

Author.objects.all().order_by(''name'')
Author.objects.all().order_by(''-name'') # 在 column name 前加一个负号,可以实现倒序

6. QuerySet 支持链式查询

Author.objects.filter(name__contains="WeizhongTu").filter(email="tuweizhong@163.com")
Author.objects.filter(name__contains="Wei").exclude(email="tuweizhong@163.com")
 
# 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.filter(name__contains="abc").exclude(age=23)

7. QuerySet 不支持负索引

Person.objects.all()[:10] 切片操作,前10条
Person.objects.all().reverse()[:2] # 最后两条
Person.objects.all().reverse()[0] # 最后一条
 
# 使用 order_by,在栏目名(column name)前加一个负号
Author.objects.order_by(''-id'')[:20] # id最大的20条

8. QuerySet 使用 .distinct() 去重

qs1 = Pathway.objects.filter(label__name=''x'')
qs2 = Pathway.objects.filter(reaction__name=''A + B >> C'')
qs3 = Pathway.objects.filter(inputer__name=''WeizhongTu'')
 
# 合并到一起
qs = qs1 | qs2 | qs3
这个时候就有可能出现重复的
 
# 去重方法
qs = qs.distinct()

关于django-将列表转换回queryset列表转json python的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Django + chart.js:使用Django Queryset数据进行绘图、Django / Python在对象列表中转换的QuerySet数据在Tuple中转换str / int值、django QuerySet、Django QuerySet API等相关内容,可以在本站寻找。

本文标签: