django - 如何将自定义管理器与相关对象一起使用?

标签 django django-managers django-orm

我有一个自定义管理器。我想将它用于相关对象。我找到了 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/

相关文章:

django - 如何解决 Django 中缺乏跨数据库外键支持的问题

django - UniqueConstraint 与 unique_together 之间的区别 - Django 2.2?

python - Django:分组依据?

Python:从数据库列查询干净的字符串值或清理 View /模板上的字符串是否更快?

django - Django Haystack:Heroku Searchbox插件无法运行rebuild_index

Django prefetch_related child 的 child

python - Django ORM将当前公司注释给用户查询集

django - 扩展 Django 用户权限

python - 使用相关对象管理器的创建方法时,django 如何分配外键?