我有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?
我有一个分页,我试图从对象页面获取索引页面(反向分页)
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) 我已经向以下模型宣布了一个经理,但在这样做之后,我再也无法使用了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'
我有两个型号:
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文档中看到:
您可能想通过覆盖
__init__方法来自定义模型.但是,如果这样做,请注意不要更改调用签名,因为任何更改都可能阻止保存模型实例.
而不是覆盖__init__,尝试使用以下方法之一:
- 在模型类上添加classmethod.
- 在自定义管理器上添加方法(通常是首选)
为什么第二种解决方案"通常是首选"?
在我有一个通过关系B扩展模型的模型的情况下,我想创建一个生成一个生成相应对象的对象的方法,如何使用自定义管理器"更好"给定我除了默认管理器提供的内容之外,可能不会使用此管理器吗?AOneToOneBA
我正在使用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内部代码使用_base_manager代替objects
也有 _default_manager
我比较习惯使用 objects
有什么不同?
我想覆盖一个类的相关管理器。
我有一个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
我有2个Django模型,ModelA用ArrayField该用于存储的主键值的大列表(可能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查询集?
有没有更好的方法呢?
文档:
我的几个模型中使用了一个自定义模型管理器。该管理器有助于加快数据库插入速度。我需要执行数据迁移,它涉及迁移数百万条记录/对象。我在数据迁移中需要自定义管理器。有谁知道如何得到它。在数据迁移上下文中,如果我运行model.objects它,就会返回 Django 的模型管理器。
django ×10
django-managers ×10
python ×2
django-1.7 ×1
django-admin ×1
foreign-keys ×1
migration ×1
postgresql ×1