我正在使用一个新的 Django 项目,该项目需要从旧数据库加载数据,但是IntegrityError: null value in column "id" violates not-null constraint在我从旧数据库加载数据后,保存新模型对象总是失败。
旧数据库中的主键范围从 10000 到 200000,新数据库是 Postgres 9.5,从不手动设置 SQL 模式。
我的模型可能很简单,例如:
class MyModel(Model):
id = IntegerField(primary_key=True)
Run Code Online (Sandbox Code Playgroud)
当我运行MyModel().save()或MyModel.create(). 可以MyModel(id=233).save()像我在加载数据时使用的那样运行。
我猜是因为它不知道从哪里开始自动生成主键。如何解决这个问题?
在 Django 应用程序中,我可以访问用户会话,然后使用flat=True. 例如我在做:
Session.objects.filter(last_activity_gte=time_window).values_list('user_id',flat=True)
Run Code Online (Sandbox Code Playgroud)
但结果受到重复和None值的污染。如何执行相同的查询并过滤掉 None 或重复项?
一种方法是:
time_window = timezone.now() - timedelta(minutes=5)
user_ids = Session.objects.filter(last_activity_gte=time_window).values_list('user_id',flat=True)
user_ids = [id for id in user_ids if id is not None]
user_ids = set(user_ids)
Run Code Online (Sandbox Code Playgroud)
但我想知道我是否可以在查询数据库时直接实现这一点,这样会更快。性能至关重要。
如果有人感兴趣,我正在使用https://github.com/Bouke/django-user-sessions来访问 Django 会话对象作为 ORM 对象
这不是预期的行为:
items = Item.objects.filter(sent=False)
items.count() # 3
items.update(sent=True)
items.count() # 0
Run Code Online (Sandbox Code Playgroud)
如何在不丢失查询集中的对象的情况下更新对象?
我有一个关于如何按多列的 SUM 过滤的问题。
例子:
class Foo(models.Model):
i1 = models.IntegerField()
i2 = models.IntegerField()
i3 = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
我需要过滤 i1、i2、i3 的 SUM 小于 200 的对象。我尝试使用以下方法实现它:
Foo.objects.agregate(i_sum=Sum(i1,i2,i3)).filter(i_sum__lt=200) # error
Foo.objects.agregate(i_sum=Sum([i1,i2,i3])).filter(i_sum__lt=200) # error
Run Code Online (Sandbox Code Playgroud)
谢谢。
I am using django 1.8.
I have two models:-
class Query(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
title = models.TextField()
details = models.TextField()
pub_date = models.DateTimeField('date published')
post_score=models.FloatField(default=0.0)
....
class Tags(models.Model):
"""docstring for Tags"""
tagname=models.TextField()
grouppostlist=models.ManyToManyField(Query,through='GroupPostsTag',through_fields=('tag','query'))
# and another model(it stores tags for a query)
class GroupPostsTag(models.Model):
query=models.ForeignKey('Query')
tag=models.models.ForeignKey('Tags')
Run Code Online (Sandbox Code Playgroud)
Now I want to sort queries based on the sum of "number of tags" and query's "post_score". I am looking for something like this:-
tagged_user_posts = Query.objects.filter(Q(tags__id__in=tags_list)).annotate(num_tags=Cast(Count('tags'),models.FloatField())).annotate(post_scores=F('num_tags')+F('post_score')).order_by('-post_scores')
Run Code Online (Sandbox Code Playgroud)
Cast is provided in django 1.10. So …
我有一个这样的 ORM
from django.db import models,
class MyObject(models.Model):
class Meta:
db_table = 'myobject'
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=48)
status = models.CharField(max_length=48)
Run Code Online (Sandbox Code Playgroud)
想象一下我有以下条目
1 | foo | completed
2 | foo | completed
3 | bar | completed
4 | foo | failed
Run Code Online (Sandbox Code Playgroud)
为了获得类似于以下的查询集,我必须进行什么 django ORM 查询
[{'name': 'foo', 'status_count': 'completed: 2, failed: 1'},
{'name': 'bar', 'status_count': 'completed: 1'}]
Run Code Online (Sandbox Code Playgroud)
我从以下开始,但我不知道如何“合并”这两列:
from django.db.models import Count
models.MyObject.objects.values(
'name',
'status'
).annotate(my_count=Count('id'))
Run Code Online (Sandbox Code Playgroud)
所有这一切的目标是获得一张表格,我可以在其中显示如下内容:
Name | completed | failed
foo | 2 | 1
bar …Run Code Online (Sandbox Code Playgroud) 我收到以下错误:
Traceback:
File "C:\Users\HP\GST\lib\site-packages\django\core\handlers\exception.py"
in inner
35. response = get_response(request)
File "C:\Users\HP\GST\lib\site-packages\django\core\handlers\base.py" in
_get_response
128. response = self.process_exception_by_middleware(e,
request)
File "C:\Users\HP\GST\lib\site-packages\django\core\handlers\base.py" in
_get_response
126. response = wrapped_callback(request, *callback_args,
**callback_kwargs)
File "C:\Users\HP\Desktop\erpcloud\accounts\views.py" in change_password
31. if form.is_valid():
File "C:\Users\HP\GST\lib\site-packages\django\forms\forms.py" in is_valid
179. return self.is_bound and not self.errors
File "C:\Users\HP\GST\lib\site-packages\django\forms\forms.py" in errors
174. self.full_clean()
File "C:\Users\HP\GST\lib\site-packages\django\forms\forms.py" in
full_clean
376. self._clean_fields()
File "C:\Users\HP\GST\lib\site-packages\django\forms\forms.py" in
_clean_fields
397. value = getattr(self, 'clean_%s' % name)()
File "C:\Users\HP\GST\lib\site-packages\django\contrib\auth\forms.py" in
clean_old_password
366. if not self.user.check_password(old_password):
File "C:\Users\HP\GST\lib\site-packages\django\contrib\auth\models.py" in …Run Code Online (Sandbox Code Playgroud) 我正在将 Django ORM 查询集用于图表,并且在更改输出格式时遇到困难
'source': ActivityLog.objects.filter(requestType='add',doDate__lte=datetime.datetime.today(), doDate__gt=datetime.datetime.today()-datetime.timedelta(days=365)).\
values(???=TruncMonth('doDate')).annotate(????=Count('requestType'), IP??=Sum('ipCnt'))},
Run Code Online (Sandbox Code Playgroud)
当我使用 'TrncMonth' 时,输出是这样的 -> 2019-10-01T00:00:00
但我只想使用 2019-10 ( YYYY-MM ) ...
有什么好的解决办法吗?
提前致谢。
这是一个孤立的 ORM 查询:
Purpose.objects.annotate(
conversation_count=SubqueryCount(
Conversation.objects.filter(goal_slugs__contains=[OuterRef("slug")]).values("id")
)
)
Run Code Online (Sandbox Code Playgroud)
其中 SubqueryCount 是:
from django.db.models import IntegerField
from django.db.models.expressions import Subquery
class SubqueryCount(Subquery):
template = "(SELECT count(*) FROM (%(subquery)s) _count)"
output_field = IntegerField()
Run Code Online (Sandbox Code Playgroud)
运行该查询时,将使用以下 sql(通过 djdt 解释):
SELECT
"taxonomy_purpose"."id",
"taxonomy_purpose"."slug",
(
SELECT count(*)
FROM (
SELECT U0."id"
FROM "conversations_conversation" U0
WHERE U0."goal_slugs" @> ARRAY['ResolvedOuterRef(slug)']::varchar(100)[]
) _count
) AS "conversation_count"
FROM "taxonomy_purpose"
Run Code Online (Sandbox Code Playgroud)
注意ResolvedOuterRef(slug)作为字符串注入到 ARRAY 查找中。我做错了什么,还是应该将此报告为错误?如果这是一个错误,是否有已知的解决方法(可能创建自定义 OuterRef 类)?
我的基本问题陈述是,我想从具有 100 万行的表中一次只提取 2000 行的每一行。在评估这些分块查询后,我想删除每一行。
所以就说我有
a = Model.objects.filter(id=1<2000)
b = Model.objects.filter(id=2000<4000)
c = Model.objects.filter(id=4000<6000)
..
..
Run Code Online (Sandbox Code Playgroud)
现在,如果我通过某种方式将所有这些查询集组合成一个查询集
del = a + b + c +d ......
我做
del.delete()
那么它会在更短的时间内删除所有行还是会再次重新处理查询以删除它们并且需要时间?