我有一个自定义管理器。我想将它用于相关对象。我找到了 use_for_related_fields在文档中。但它并不像我使用的那样工作:
class RandomQueryset(models.query.QuerySet):
def randomize(self):
count = self.count()
random_index = random.randint(0, count - 1)
return self.all()[random_index]
class RandomManager(models.Manager):
use_for_related_fields = True
def get_query_set(self):
return RandomQueryset(self.model, using=self._db)
def randomize(self):
return self.get_query_set().randomize()
我将它用于一个模型:
>>> post = PostPages.default_manager.filter(image_gallery__isnull=False).distinct().randomize()
并尝试对 m2m 相关对象做同样的事情:
>>> post.image_gallery.randomize()
出现错误:
AttributeError: 'ManyRelatedManager' object has no attribute 'randomize'
是否可以像我那样使用自定义管理器?如果是这样,您如何让它发挥作用?
编辑
我的模型:
class ShivaImage(models.Model, ImageResizing):
image = models.ImageField(upload_to='img')
slide_show = models.BooleanField()
title = models.CharField(max_length=100)
text = models.TextField(max_length=400)
ordering = models.IntegerField(blank=True, null=True)
objects = RandomManager()
class PostPages(models.Model):
image_gallery = models.ManyToManyField(ShivaImage, blank=True,
related_name='gallery',)
# all the other fields...
objects = RandomManager()
最佳答案
为了主题的完整性,Django 1.7(最终)支持 using a custom reverse manager ,所以你可以做类似的事情(只需从 django 文档中复制):
from django.db import models
class Entry(models.Model):
objects = models.Manager() # Default Manager
entries = EntryManager() # Custom Manager
b = Blog.objects.get(id=1)
b.entry_set(manager='entries').all()
关于django - 如何将自定义管理器与相关对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7489635/