Django QuerySet с моделями

Я новичок в 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()

Что я хочу сделать, так это вернуть весь столбец имени в виде массива, если идентификатор учетной записи совпадает. Я хотел бы использовать функцию в models.py, но я не нашел онлайн-образца, который соответствует тому, что я ищу.

Вышеприведенное не возвращает никаких данных даже без фильтра.

Любая точка в правильном направлении была бы потрясающей.


person Andrew    schedule 24.12.2013    source источник
comment
вы хотите вернуть значение поля имени для записи с заданным идентификатором учетной записи?   -  person pkacprzak    schedule 25.12.2013
comment
Я хочу вернуть все значения поля имени для всех записей с заданным идентификатором учетной записи.   -  person Andrew    schedule 25.12.2013


Ответы (2)


Используйте objects.filter и classmethod:

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()
person ndpu    schedule 24.12.2013
comment
Вы также можете использовать self.objects.filter(accountid=self.accountid), так как вы вызываете это как метод экземпляра. Если вы этого не сделаете, возможно, более чистым решением было бы объявить вышеуказанное как метод класса. - person Peter DeGlopper; 25.12.2013
comment
Как бы я назвал это в представлении? как я уже сказал, очень новичок в Django. :\ - person Andrew; 25.12.2013
comment
Ни один из них не будет работать, так как вы не можете получить доступ к objectsиз экземпляра. - person Daniel Roseman; 25.12.2013
comment
Я думаю что он ищет статический метод, но конечно +1 за точный ответ и за flat=True - person pkacprzak; 25.12.2013
comment
Я ищу, чтобы он был динамическим в зависимости от того, кто вошел в систему - person Andrew; 25.12.2013
comment
@AndrewWilson просто вызовите Channel.get_channel_list(ACCOUNTID_YOU_NEED), и список с именами будет возвращен - person ndpu; 25.12.2013
comment
Вы, сэр, человек, это идеально подходит для того, что мне нужно, и я могу расширить это. - person Andrew; 25.12.2013
comment
@ndpu У меня проблемы с сортировкой по asc, я использую return cls.objects.filter(accountid=account).order_by('-name').values_list('name', 'channelid') Он перечисляет их в следующем порядке: ТЕСТ, ТЕСТ B, ТЕСТ КАНАЛ, ТЕСТ КАНАЛ, ТЕСТ 2, ТЕСТ AB, ТЕСТ КАНАЛ, ТЕСТ 3, ТЕСТ 3, ТЕСТ 2 КАНАЛ... Есть мысли? - person Andrew; 25.12.2013
comment
понял, это потому, что он чувствителен к регистру, хм. все еще в тупике - person Andrew; 25.12.2013
comment
Поскольку это действительно новый вопрос, я разместил для него собственный вопрос " title="django query sort без учета регистра с использованием метода модели с postgresql"> stackoverflow.com/questions/20768955/ - person Andrew; 25.12.2013

Вы не поняли разницы между менеджерами и моделями. Это менеджер, который отвечает за создание запросов и имеет метод get_queryset. Из модели вам нужно получить доступ к менеджеру, который обычно называется объектами. Обратите внимание: вы не можете сделать это из экземпляра, поэтому это должен быть метод класса.

@classmethod
def get_channel_list(cls, accountid):
    return cls.objects.filter(accountid=accountid).values_list('name')
person Daniel Roseman    schedule 24.12.2013