标签: django-orm

使用自定义管理器引用相关对象

我想获取相关的对象引用,并且我想使用自定义管理器。

外面有什么东西吗?我如何使用自定义管理器来获取这些对象?

 b.entry_set.all()
Run Code Online (Sandbox Code Playgroud)

例如

b.custom_manager.entry_set.all()
b.entry_custom_manager_set.all()
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm

5
推荐指数
1
解决办法
485
查看次数

Django annotate() 性能 - 它应该超级慢吗?

annotate() 使事情变得缓慢如爬行一样正常吗?

使用这样的注释:

post_list = j.post_set.all().annotate(num_comments=Count('comment')).order_by('-pub_date')
Run Code Online (Sandbox Code Playgroud)

与不做注释相比,花费的时间是原来的四倍:

post_list = j.post_set.all().order_by('-pub_date')
Run Code Online (Sandbox Code Playgroud)

我还尝试使用 value() 和 defer() ,但这些也没有帮助。将评论数量保留为 Post 表中的字段是唯一真正的选择吗?

顺便说一句,我正在使用MySQL。

python django database-design django-models django-orm

5
推荐指数
1
解决办法
7341
查看次数

Django 字段的多级选择

我有一个模型,我想使用 choice= 选项,但深度为三层。

class Doctor(models.Model):
...
zipcode = models.CharField(max_length=10, choices=AREAS, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

在管理员的“邮政编码”下拉列表中,我希望层次结构为:

Bronx
--Kingsbridge
----10463
----10471
--Fordham
----10458 
----10467
----10468 
Brooklyn
--Borough Park
----11204
etc.
Run Code Online (Sandbox Code Playgroud)

然后,如果我选择邮政编码 10463,Doctor 对象将与布朗克斯区的 Kingsbridge 区域关联。我正在尝试各种不同的方法。我最接近的是使用这个:

AREAS = (
    ('Bronx', (('Kingsbridge', ('10463', '10463'),),)),
    ...
)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这给了我这样的层次结构:

Bronx
--('10463', '10463')
Run Code Online (Sandbox Code Playgroud)

这很奇怪而且没有帮助。有人能看出我哪里出错了吗?这种层次结构可能吗?在应用程序中创建另一个名为 Areas 的表并使用多位字段会更明智吗?我想得越多,我就越觉得我必须使用 Manytomany 字段。提前致谢

django django-models django-orm django-admin

5
推荐指数
1
解决办法
3633
查看次数

保存在 django 中后,对象的 id 为 None

我正在循环遍历对象列表并保存。我需要保存后新生成的 id 或指针 id,但它是 None。

这是我的代码:

for category in category_list:
      saved_category = category.save()
      print saved_category.parentCategory_ptr_id      
      print saved_category.id
Run Code Online (Sandbox Code Playgroud)

这会在例程运行后保存我的对象,但同样不会在这一行给我 id。

这是我的模型:

class ParentCategory(models.Model):
    name = models.CharField(max_length=255)

class Category(ParentCategory):
    description = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

类别列表的创建方式如下:

category_list = []
    for row in value_list:
        category = Category(description=row.description)
        category_list.append(category)


 return category_list
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

django django-models django-orm django-inheritance multi-table-inheritance

5
推荐指数
1
解决办法
5960
查看次数

Django - 使用 get_FOO_display 进行聚合

考虑以下:

status = queryset.values('status').annotate(count=Count('status'))
Run Code Online (Sandbox Code Playgroud)

其中statusfield 是CharFieldwith choices。这将产生一个包含status数据库值及其计数的字典列表。

有没有办法聚合status并显示其显示值?我已经查找了我可能可以模拟的代码_get_FIELD_display,但重复框架的内部代码感觉有点黑客。

django django-orm django-aggregation

5
推荐指数
1
解决办法
1884
查看次数

如何根据模型类上返回布尔值的方法的结果来过滤查询集?

作为我的模型类之一的成员函数,我有一个is_visible(self, user)返回布尔值的方法。根据定义,它将请求用户(DjangoUser模型)作为输入。

我希望能够根据对此方法的响应来过滤查询集。如何使用此函数作为查询集过滤器?

对于上下文,这是我的is_visible实现:

    def is_visible(self, user):
        if self.status.status_internal == "open":
            return True
        if self.owner == user:
            return true

        participations = Participation.objects.filter(event__id=self.id, participant__id=user.id)
        if len(participations) > 0:
            return True

        if self.status.status_internal == "invite":
            return True

        return False
Run Code Online (Sandbox Code Playgroud)

python django django-orm

5
推荐指数
1
解决办法
5491
查看次数

django 管理面板带有 LIMIT 的自定义 get_queryset

我想要一个自定义查询来在我的管理 django 面板中显示元素列表。

因此,为了实现这一点,我使用如下代码:

class MyAdmin(admin.ModelAdmin):
....
   def get_queryset(self, request):
        return Post.objects.filter(author_type=AuthorType.USER)
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我还需要为此查询集添加一个 LIMIT:

class MyAdmin(admin.ModelAdmin):
....
   def get_queryset(self, request):
        return Post.objects.filter(author_type=AuthorType.USER)[:500]
Run Code Online (Sandbox Code Playgroud)

但是当我添加限制子句时,[:500]出现此错误:

异常值:获取切片后无法对查询重新排序。

有什么建议么?

python django django-orm django-admin django-queryset

5
推荐指数
1
解决办法
3763
查看次数

在Django中,我可以在创建对象时指定数据库吗?

看看这个 Django ORM 代码:

my_instance = MyModel()
my_instance.some_related_object = OtherModel.objects.using('other_db').get(id)
Run Code Online (Sandbox Code Playgroud)

此时,在第二行,Django会抛出错误:

ValueError: Cannont assign "<OtherModel: ID>": instance is on database "default", value is on database "other_db"
Run Code Online (Sandbox Code Playgroud)

对我来说,这没有多大意义。my_instance如果我什至没有调用,Django 如何知道哪个数据库是:

my_instance.save(using='some_database')
Run Code Online (Sandbox Code Playgroud)

然而?

我猜想,在构造对象期间,Django 会自动将其分配给default数据库。我可以改变它吗?我可以在创建对象时通过将参数传递给其构造函数来指定数据库吗?根据文档,创建对象时我可以传递的唯一参数是其字段的值。那么我该如何解决我的问题呢?

在 Django 1.8 中,有一个名为Model.from_db ( https://docs.djangoproject.com/en/1.8/ref/models/instances/ ) 的新方法,但我使用的是早期版本的 Django,无法切换到现在较新。查看实现,它所做的只是设置两个模型的属性:

instance._state.adding = False
instance._state.db = db
Run Code Online (Sandbox Code Playgroud)

那么将我的代码更改为:

my_instance = MyModel()
my_instance._state.adding = False
my_instance._state.db = 'other_db'
my_instance.some_related_object = OtherModel.objects.using('other_db').get(id)
Run Code Online (Sandbox Code Playgroud)

或者现在这样做已经太晚了,因为这些标志在构造函数中使用并且必须仅在构造函数中设置?

python django orm django-orm django-database

5
推荐指数
1
解决办法
1722
查看次数

Django:使用不带ForeignKey字段的select_lated

我有两个模型与我无法控制的数据库一起使用。两者均设置为managed = False. 第一个模型有一个字段,它是第二个模型的外键,但它是作为 实现的CharField,而不是作为ForeignKey

是否可以select_related在第一个模型上使用来访问密钥第二个模型的属性?

这是一个例子:

class Foo(models.Model):
    class Meta:
        managed = False
    fieldone = models.CharField(max_length=10)
    myfk = models.CharField(max_length=20) # In practice, this points to Bar.localkey

class Bar(models.Model):
    class Meta:
        managed = False
    localkey = models.CharField(max_length=20)
    someotherattribute = models.CharField(max_length=100)

Foo.objects.all().select_related('Bar') # I know this won't work, but is there something that will? 
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm

5
推荐指数
1
解决办法
4125
查看次数

Django 从 PostgreSQL 特定的 ArrayField 中获取最小值和最大值,其中包含 IntegerField(s)

我的模型中有一个ArrayField持有IntegerFields。我正在寻找可以从该数组中提取最小和最大整数的最佳方法。

Django 文档没有给出类似的例子,我想知道正确的方法是否是找出如何以及是否可以在这个 ArrayField 上使用聚合函数,或者我是否可以以某种方式将其转换为正常的 Python整数列表并使用内置最小,最大功能?

执行此操作的任何建议都会有所帮助。例子更多。

python django django-orm

5
推荐指数
1
解决办法
254
查看次数