标签: django-managers

Django模型是否继承了经理?(我的似乎不是)

我有2个型号:

class A(Model):
    #Some Fields
    objects = ClassAManager()

class B(A):
    #Some B-specific fields
Run Code Online (Sandbox Code Playgroud)

我希望B.objects能让我访问一个实例ClassAManager,但事实并非如此......

>>> A.objects
<app.managers.ClassAManager object at 0x103f8f290>
>>> B.objects
<django.db.models.manager.Manager object at 0x103f94790>
Run Code Online (Sandbox Code Playgroud)

为什么不从中B继承objects属性A

python django django-models django-managers

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

Django分页(获取对象对应的页号)

我有一个分页,我试图从对象页面获取索引页面(反向分页)

get_pagination_posts 返回模型的分页器Post

class PostManager(models.Manager):
    def get_paginated_posts(self, request=None):
        if request and request.user.has_perm('blog.change_post'):
            posts = super(PostManager, self).filter(is_update=False)
        else:        
            posts = super(PostManager, self).filter(publish=True, is_update=False)
        return Paginator(posts, POSTS_PER_PAGE)
    .
    .
Run Code Online (Sandbox Code Playgroud)

这是我的模型

class Post(models.Model):
    .
    .
    .
    def get_page(self, request=None):
        paginator = Post.objects.get_paginated_posts(request)
        for i in range(1, paginator.num_pages+1):
            if self in paginator.page(i).object_list:                
                return i
            pass
        return False 
Run Code Online (Sandbox Code Playgroud)

我关心的是Post.objects.get_paginated_postsget_page 函数中的调用。从实例
调用类是否正确?Post还有其他更好的方法可以做到这一点吗?
为什么我不能打电话super(Post, self).objects.get_paginated_posts做同样的事情?
我知道这self.objects.get_paginated_posts不会起作用,因为对象无法访问其管理器。

解决了

Tomasz Elendt 建议的最终代码:

class PostManager(models.Manager):
    def get_paginated_posts(self, user=None):
        if …
Run Code Online (Sandbox Code Playgroud)

django django-models django-managers django-pagination

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

为什么将管理器声明为Django模型,使"对象"无效

我已经向以下模型宣布了一个经理,但在这样做之后,我再也无法使用了List.objects.get().谁知道为什么?

class List(models.Model):
  title = models.CharField(max_length=20, unique=True)
  archived = models.BooleanField()

  archived_lists = ArchivedListManager()
  active_lists = ActiveListManager()
Run Code Online (Sandbox Code Playgroud)

经理们:

class ArchivedListManager(models.Manager):
  def get_query_set(self):
    return super(ArchivedListManager, self).get_query_set().filter(archived=True)

class ActiveListManager(models.Manager):
  def get_query_set(self):
    return super(ActiveListManager, self).get_query_set().filter(archived=False)
Run Code Online (Sandbox Code Playgroud)

错误是 type object 'List' has no attribute 'objects'

django django-managers

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

Django - 从django模板访问外键的Manager

我有两个型号:

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

class ProductPhoto(models.Model):
    product = models.ForeignKey('Product', related_name='photos')
    is_live = models.IntegerField(choices=LIVE_CHOICES, default=1)

    live = LiveManager()

class LiveManager(Manager):
    def get_query_set(self):
        return super(LiveManager, self).get_query_set().filter(is_live=1)
Run Code Online (Sandbox Code Playgroud)

我想从产品详细信息模板中获取实时照片.

试过了,

{% for photo in product.photos.live %}
Run Code Online (Sandbox Code Playgroud)

这不起作用,看了文档,找不到例子.是否可以从模板中调用外键的管理器?我应该在Product model中创建一个返回产品照片查询集的函数吗?

谢谢.

django django-templates django-models django-managers

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

使用自定义管理器使用django创建对象的目的?

我在Django文档中看到:

模型实例参考:创建对象

您可能想通过覆盖__init__方法来自定义模型.但是,如果这样做,请注意不要更改调用签名,因为任何更改都可能阻止保存模型实例.
而不是覆盖__init__,尝试使用以下方法之一:

  • 在模型类上添加classmethod.
  • 在自定义管理器上添加方法(通常是首选)

为什么第二种解决方案"通常是首选"?

在我有一个通过关系B扩展模型的模型的情况下,我想创建一个生成一个生成相应对象的对象的方法,如何使用自定义管理器"更好"给定我除了默认管理器提供的内容之外,可能不会使用此管理器吗?AOneToOneBA

django django-managers

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

Django,自定义管理器会影响保存方法吗?

我正在使用Django 1.7.我有一个默认的自定义管理器,可以过滤"活动"布尔字段.根据文档,它需要是使用相关字段的默认管理器(即访问User.story_set仅显示活动的Story对象).我保留了管理员和shell访问的标准管理器,但我无法保存对象的更改,我猜测因为save()方法在某些时候通过默认管理器.

class Story(models.Model):
    active = models.BooleanField(default=True)
    ....

    objects = ActiveStoryManager()
    full_set = models.Manager()

class ActiveStoryManager(models.Manager):
    def get_query_set(self):
        return super(ActiveStoryManager, self).get_query_set().filter(active=True)
    use_for_related_fields = True
Run Code Online (Sandbox Code Playgroud)

这适用于所有面向公众的用途.但是,在admin和shell中,我无法影响非活动对象,包括将它们恢复为活动状态.

story = Story.full_set.get(id=#)将获取一个故事active=False,但在设置后active=True我无法保存,得到一个

django.db.utils.IntegrityError: duplicate key value violates unique constraint "stories_story_pkey" DETAIL: Key (id)=(#) already exists.

致电save.(force_update=True)回报django.db.utils.DatabaseError: Forced update did not affect any rows.

因此,虽然save()是一个模型方法,但它似乎依赖于保存过程中某个时刻的默认管理器.

解决方法是使用Queryset API,例如Story.full_set.filter(id=#).update(active=True),但只能在shell中使用,并且需要手动键入每个更改,仍然无法在管理中保存非活动实例.

对此有何帮助?

django django-models django-admin django-managers

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

django,_base_manager和对象之间的区别

Django内部代码使用_base_manager代替objects

也有 _default_manager

我比较习惯使用 objects

有什么不同?

django django-managers

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

在django中定义自定义RelatedManager

我想覆盖一个类的相关管理器。

我有一个Company模型。它有state可以在ACTIVE, INACTIVE,中的列SUSPENDED。我添加了 2 个新状态,称为SALES, CLOSED

由于其遗留模型,仅仅添加状态可能是毁灭性的(代码中有很多地方没有按状态过滤)。

因此,为了避免其他地方发生无意的更改,我决定隐藏所有其他应用程序/其他地方的新状态,除非另有要求(我将仅将我们的应用程序/模型列入白名单)

我已经覆盖了公司中的对象管理器。

class CompanyManager(models.Manager):

    def get_queryset(self):
        return super(CompanyRelatedManager, self).get_queryset().exclude(state__in=['SALES', 'CLOSED'])

class Company(models.Model):
    _default_manager = models.Manager()
    objects = CompanyManager()
    allObjects = models.Manager()

    name = models.TextField()
    ...
    salesContact = models.ForeignKey(Contact)
Run Code Online (Sandbox Code Playgroud)

问题在于Company.objects.filter(blah=blah)过滤掉了新的状态。但类似的事情salesContact.companies.all()却没有。

In [9]: salesContact.companies
Out[9]: <django.db.models.fields.related.RelatedManager at 0x12157a990>
Run Code Online (Sandbox Code Playgroud)

我的问题是如何覆盖相关管理器等,salesContact = models.ForeignKey(Contact)以便我可以修改默认查询集以排除我的新状态。

而且,我无法覆盖默认管理器,因为覆盖默认管理器也意味着我正在覆盖这会导致db_manager意外的后果(数据库尝试插入而不是更新,整个其他故事)。

django foreign-keys django-models django-managers django-1.7

5
推荐指数
0
解决办法
1973
查看次数

将django RawQuerySet转换为Queryset

我有2个Django模型,ModelAArrayField该用于存储的主键值的大列表(可能50K +列表)

class ModelA(models.Model):
    pk_values = ArrayField(models.IntegerField())

class CustomManager(manager.Manager):

    def get_for_index(self, index_id):
        qs = self.get_queryset()
        obj = ModelA.objects.get(pk=index_id)
        return qs.filter(id__in=obj.pk_values)

class ModelB(models.Model):
    # [...] some fields

    objects = CustomManager()
Run Code Online (Sandbox Code Playgroud)

这有效:

qs = ModelB.objects.get_for_index(index_id=1)
Run Code Online (Sandbox Code Playgroud)

但是,如果"pk_values"是一个大型列表,这将是超级慢的.

所以我尝试了原始的SQL查询:

class CustomManager(manager.Manager):
    def get_for_index(self, index_id):
        qs = self.get_queryset()
        sql = "SELECT * FROM myapp_model_b JOIN myapp_model_a ON myapp_model_b.id = ANY(myapp_model_a.pk_values) WHERE myapp_model_a.id = '%s'" % index_id
        return qs.raw(sql)
Run Code Online (Sandbox Code Playgroud)

但这会返回一个django.db.models.query.RawQuerySet实例.

但有了这个,我就不能做事queryset.values()了.

如何将其转换为普通的Django查询集?

有没有更好的方法呢?

文档:

python django postgresql django-models django-managers

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

如何在 Django 数据迁移上下文中访问模型的自定义管理器?

我的几个模型中使用了一个自定义模型管理器。该管理器有助于加快数据库插入速度。我需要执行数据迁移,它涉及迁移数百万条记录/对象。我在数据迁移中需要自定义管理器。有谁知道如何得到它。在数据迁移上下文中,如果我运行model.objects它,就会返回 Django 的模型管理器。

migration django django-models django-managers

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