标签: django-orm

从旧数据库加载数据后,Django ORM 无法自动设置模型的主键

我正在使用一个新的 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 postgresql django-models django-orm

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

从 Django 查询集中过滤掉重复值和无值

在 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 对象

django django-orm django-queryset

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

Django 查询集更新方法从查询集中删除对象

这不是预期的行为:

items = Item.objects.filter(sent=False)

items.count() # 3

items.update(sent=True)

items.count() # 0
Run Code Online (Sandbox Code Playgroud)

如何在不丢失查询集中的对象的情况下更新对象?

django django-orm django-queryset

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

Django ORM,多列的总和

我有一个关于如何按多列的 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)

谢谢。

django django-orm django-aggregation

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

how to cast the output of Count() in django to FloatField in django 1.8

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 …

django django-models django-orm

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

每列 Django 计数

我有一个这样的 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)

python django django-models django-orm

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

NotImplementedError:Django 没有为 AnonymousUser 提供 DB 表示

我收到以下错误:

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)

python django django-forms django-orm django-views

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

Django queryset TruncMonth 输出格式问题

我正在将 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 ) ...

有什么好的解决办法吗?

提前致谢。

django django-orm django-queryset

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

Django ORM:按数组过滤包含子查询中的 OuterRef 产生零结果

这是一个孤立的 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 类)?

django django-orm

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

如何从django中的db中获取数据块然后删除它们?

我的基本问题陈述是,我想从具有 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()

那么它会在更短的时间内删除所有行还是会再次重新处理查询以删除它们并且需要时间?

django postgresql django-models django-orm

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