相关疑难解决方法(0)

在django queryset上使用iterator()

我最近遇到了一些奇怪的行为,需要检查一下我的理解.

我在模型中使用了一个简单的过滤器,然后迭代结果.

例如

allbooks = Book.objects.filter(author='A.A. Milne')

for book in allbooks:
   do_something(book)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它只返回了部分书籍清单.

但是,当使用相同的代码并使用iterator()时,这似乎运行良好.

for book in allbooks.iterator():
    do_something(book)
Run Code Online (Sandbox Code Playgroud)

知道为什么??

ps我确实浏览了django文档,但看不到qeuryset如何在其他任何地方缓存...

iterator() 计算QuerySet(通过执行查询)并在结果上返回迭代器.QuerySet通常在内部缓存其结果,以便重复的评估不会导致其他查询; iterator()而是直接读取结果,而不在QuerySet级别进行任何缓存.对于返回大量对象的QuerySet,这通常会带来更好的性能并显着降低内存

请注意,iterator()在已经评估过的QuerySet 上使用将强制它再次进行评估,重复查询.

django iterator django-queryset

14
推荐指数
1
解决办法
3万
查看次数

Django 抛出“禁止直接分配到多对多集合的前端”。错误

我有两个模型在DjangoUsersContexts。我所定义的模型如下

class User(models.Model):
    userId = models.PositiveIntegerField(null = False)
    pic = models.ImageField(upload_to=getUserImagePath,null=True)
    Email = models.EmailField(null = True)

class Contexts(models.Model):
    context_name = models.CharField(max_length=50)
    context_description = models.TextField()
    context_priority = models.CharField(max_length=1)
    users = models.ManyToManyField(User, related_name='context_users')
Run Code Online (Sandbox Code Playgroud)

现在我收到一个包含以下 JSON 的 POST 请求

{
"user" : 12,
"action" : "add",
"context_name": "Network debug",
"context_description" : "Group for debugging network issues",
"context_priority": "L"
}
Run Code Online (Sandbox Code Playgroud)

我想在表中创建一条记录。Contexts下面是我想要做的

from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
import json
from .models import …
Run Code Online (Sandbox Code Playgroud)

django manytomanyfield python-3.x

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

Django :禁止直接分配给多对多集合的前端。改用 user.set()

当我尝试将当前登录的用户作为ManyToManyField.

TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use user.set() instead.
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

视图.py

def add_to_cart(request , item):
    name = item
    size = request.POST.get("size")
    extras = request.POST.get("extras")
    c = Cart(item=name , size=size , extras=extras , user=request.user)
    c.save()
    return render(request , "orders/add_items.html" , {"message":f"{name} added to cart"})
Run Code Online (Sandbox Code Playgroud)

模型.py

class Cart(models.Model):
    item = models.CharField(max_length=64)
    size = models.DecimalField(max_digits=5,decimal_places=2)
    extras = models.CharField(max_length=64 , null=True, blank=True)
    user = models.ManyToManyField(User , related_name="member")

def __str__(self):
    return f"{item} added by {user}"
Run Code Online (Sandbox Code Playgroud)

python django python-3.x

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