【问题标题】:Django QuerySet with Models带有模型的 Django QuerySet
【发布时间】:2014-01-13 00:15:50
【问题描述】:

我是 Django 新手,正在尝试了解如何将查询集与模型一起使用。

Model
class Channel(models.Model):
    name = models.CharField(max_length=200)
    accountid = models.CharField(max_length=34)

    def get_channel_list(self):
        return self.get_queryset().name()

如果帐户 ID 匹配,我想要做的是将整个名称列作为数组返回。我想在 models.py 中使用一个函数,但我没有找到适合我正在寻找的在线示例。

即使没有过滤器,上述内容也不会返回任何数据。

朝着正确方向的任何一点都会令人惊叹。

【问题讨论】:

  • 是否要为具有给定 accountid 的记录返回名称字段值?
  • 我想返回给定 accountid 的所有记录的所有 name 字段值。

标签: python django python-2.7 django-1.5


【解决方案1】:

使用objects.filterclassmethod

class Channel(models.Model):
    name = models.CharField(max_length=200)
    accountid = models.CharField(max_length=34)

    @classmethod
    def get_channel_list(cls, acc):
        return cls.objects.filter(accountid=acc).values_list('name', flat=True)

在 django 中还有另一种技术可以做这些事情 - 定义自定义管理器来建模。 (例如,您从一个基本代理模型继承了多个 Channel 模型,并且您希望将相同的 get_channel_list 函数放入某些模型 - 自定义管理器是要走的路):

class ChannelManager(models.Manager):
    def get_channel_list(self, acc):
        return self.filter(accountid=acc).values_list('name', flat=True)

class Channel(models.Model):
    name = models.CharField(max_length=200)
    accountid = models.CharField(max_length=34)

    objects = ChannelManager()

【讨论】:

  • 您也可以使用self.objects.filter(accountid=self.accountid),因为您将其作为实例方法调用。如果你不这样做,将上面声明为类方法可能是更纯粹的设计。
  • 如何在视图中调用它?就像我说的,对 Django 来说很新。 :\
  • 这些都不起作用,因为您无法从实例访问objects
  • 我认为他正在寻找一种静态方法,但当然 +1 以获得确切答案和 flat=True
  • 我正在寻找它是动态的,这取决于谁登录
【解决方案2】:

您没有理解经理和模型之间的区别。它是负责创建查询的管理器,它具有get_queryset 方法。从模型中,您需要访问管理器,该管理器通常被命名为对象。请注意,您不能从实例中执行此操作,因此这需要是类方法。

@classmethod
def get_channel_list(cls, accountid):
    return cls.objects.filter(accountid=accountid).values_list('name')

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 2016-11-19
    • 2011-04-18
    • 2014-02-18
    • 2021-11-03
    • 1970-01-01
    • 2010-11-23
    • 2017-12-05
    相关资源
    最近更新 更多