这不是预期的行为:
items = Item.objects.filter(sent=False)
items.count() # 3
items.update(sent=True)
items.count() # 0
Run Code Online (Sandbox Code Playgroud)
如何在不丢失查询集中的对象的情况下更新对象?
我有一个非常复杂的模型,有许多FK和M2M的相关模型,它们也有很多关系,等等.
因此,呈现此类对象的列表是一项非常昂贵的SQL操作,我想对其进行优化.(select_related和prefetch_related帮助,但有点)
我可能有一个非常愚蠢但非常简单的想法.
要做这样的事情:
class VeryComplexModel(models.Model):
# some_field
# some_field
# ...
json = models.TextField()
def save(self):
json = serialize(self)
Run Code Online (Sandbox Code Playgroud)
在views.py中:
complexModels = ComplexModel.objects.get_values(json)
Run Code Online (Sandbox Code Playgroud)
在模板中:
{% for m in complexModels %}
{{ m.some_field }}
{{ m.some_field.some_fields.some_field }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
这是个坏主意吗?也许这是一个好主意,但我应该使用更合适的东西,如特殊的JSON字段或其他东西?
伟大的建议!
这是一个简单的例子:
<script>
import Button from './Button.svelte';
let text = 'Click me!';
let sayHello = () => alert('Hello!');
</script>
<Button {text} {sayHello}/>
<Button {text} {sayHello}/>
<Button {text} {sayHello}/>
Run Code Online (Sandbox Code Playgroud)
如果我做对了,因为可能有很多<Button {text} {sayHello}/>,所以省略以某种方式传递的道具会很好
这里来上下文API:
<script>
import Button from './Button.svelte';
import { setContext } from 'svelte';
import { text, sayHello } from './data.js';
setContext(text, 'Click me!');
setContext(sayHello, () => alert('Hello!'));
</script>
<Button/>
<Button/>
<Button/>
Run Code Online (Sandbox Code Playgroud)
并且在某处./Button.svelte有getContext()使用等
那么,省略类似道具传递的能力是使用 Svelte 的Context API的唯一原因吗?
我在调度员中有两个网址指向相同的视图
path('posts/top/', posts, name='top'),
path('posts/new/', posts, name='new'),
Run Code Online (Sandbox Code Playgroud)
我希望查看开始如下:
def posts(request, ordering):
...
Run Code Online (Sandbox Code Playgroud)
我想,传递top和new作为参数应该是这样的:
path('posts/<ordering:top>/', posts, name='top'),
path('posts/<ordering:new>/', posts, name='new'),
Run Code Online (Sandbox Code Playgroud)
但它给了我:
django.core.exceptions.ImproperlyConfigured: URL route 'posts/<ordering:top>/' uses invalid converter 'ordering'.
Run Code Online (Sandbox Code Playgroud)
所以,作为一个解决方法我使用它,但它看起来有点脏:
path('posts/top/', posts, name='top', kwargs={'order': 'top'}),
path('posts/new/', posts, name='new', kwargs={'order': 'top'}),
Run Code Online (Sandbox Code Playgroud)
做正确的方法是什么?
我有一个简单地隐藏内容的应用程序Hidden.svelte:
<script>
export let shown = false;
</script>
<svelte:options accessors={true}/>
{#if shown}
<slot/>
{/if}
Run Code Online (Sandbox Code Playgroud)
在 parent 中一切正常App.svelte:
<script>
import Hidden from 'Hidden';
let child;
</script>
<Hidden bind:this={child}>
Content
</Hidden>
<button on:click={() => child.shown = true}>Show</button>
Run Code Online (Sandbox Code Playgroud)
但是,虽然我可以这样做,但我不能这样on:click={child.shown = true}做:
{#if child.shown}
External message!
{/if}
Run Code Online (Sandbox Code Playgroud)
显然,我也不能这样做:
<div class:shown={child.shown}>Child component is shown</div>
Run Code Online (Sandbox Code Playgroud)
我想,这就是所有的,因为它在安装之前渲染,但是我所有的努力与玩onMount和$:失败
它可以以某种方式实现吗?谢谢
编辑
对不起,大家,我已经尝试尽可能简单地举一个例子,并且做了一个完全不能反映我最初问题的例子,但是,从技术上讲,得到了正确的答案
所以,问题是,父级App.svelte没有反映child.shown直接在内部进行的更改Hidden.svelte
@ThomasHennes 建议使用商店来解决这个问题,但是,如果我做对了,这是单个应用程序实例的好方法,因此,对于那些感兴趣的人,我最终会遇到常规事件:
https://svelte.dev/repl/f467fe36446444f09a2a7633b1faa6a1?version=3.20.1
编辑 2
在接受的答案中解决了真正的问题