gpt4 book ai didi

python - 子类化 models.Manager

转载 作者:太空狗 更新时间:2023-10-29 21:53:34 28 4
gpt4 key购买 nike

我认为对 models.manager 对象进行子类化和覆盖 get_query_set 方法或者只是在子类中创建一个新方法并使用该方法没有区别。原因是我从 django 书中举了例子;

class MaleManager(models.Manager):
def get_query_set(self):
return super(MaleManager, self).get_query_set().filter(sex='M')
class FemaleManager(models.Manager):
def get_query_set(self):
return super(FemaleManager, self).get_query_set().filter(sex='F')
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
people = models.Manager()
men = MaleManager()
women = FemaleManager()

我可以用这个; Person.women.all()Person.men.all() 获取所有男性或女性模型对象。但是,我想类似的事情可以在不覆盖 get_query_set 方法的情况下实现;

class MaleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
class FemaleManager(models.Manager):
def get_female(self):
return return self.filter(sex='F')
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
people = models.Manager()
men = MaleManager()
women = FemaleManager()

现在,有了这个,我可以使用一些小技巧来获取所有这些对象;Person.objects.get_male()Person.objects.get_female()。但是,我如何获取对象之间没有任何细微差别,但在第一种情况下的可读性和使用方面存在差异,而第二种情况更容易理解并且代码更少。它们在编码和模式?第二个的另一件事是,如果我将这两个方法放在同一个类中会怎么样;

class PeopleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
def get_female(self):
return return self.filter(sex='F')

最佳答案

  1. 通常您不希望模型有多个经理。最好扩展默认管理器。

    class PeopleManager(models.Manager):
    def get_male(self):
    return self.filter(sex='M')

    def get_female(self):
    return return self.filter(sex='F')

    class Person(models.Model):
    ....
    objects = PeopleManager()

    然后您将能够使用 Person.objects.get_male()Person.objects.get_female()Person 等内置方法。 objects.order_by()。例如,您可以查看 django.contrib.auth.models 中的自定义管理器。

  2. get_query_set 有利于继承。例如你可以定义

    class SmithManager(PeopleManager):
    def get_queryset(self):
    return super(SmithManager, self).get_query_set().filter(last_name='Smith')

    并且经理的所有方法将只返回 Smiths,(Person.objects.get_male() 将只返回名为 Smith 的男性等等)。而且你不需要重写所有的方法。

关于python - 子类化 models.Manager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8640809/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com