2009-07-25 2 views
2

Например, у меня есть модель Сообщения и Комментарии.Добавить поле в модель, as annotate do

Post.objects.annotate(Count('comment')) 

Я делаю такой запрос, чтобы получить количество комментариев для каждого сообщения. Но в шаблоне я должен проверить, больше ли это значение больше 4. Как я знаю, такого шаблона нет. На данный момент я помещаю метод в модель, которая выполняет операцию сравнения.

Вопрос в том, как поставить поле модели в качестве аннотации делать?

ответ

1

Модели - это просто классы, а в экземплярах класса Python динамические. Это означает, что вы можете добавить любое свойство, которое вам нравится в экземпляр, просто назначив его.

myinstance = MyModel.objects.get(pk=1) 
myinstance.mycomparisonattribute = True 

Однако я не понимаю, почему это лучше, чем использование метода сравнения. В качестве альтернативы используйте специальный тег шаблона, который может выполнять сравнения - ярлык SmileyChris smart if отлично.

+0

Вы правы, я понял свою ошибку. Я пишу вместо этого myinstance.mycomparisonattribute - myinstance ['mycomparisonattribute'] –

0

Вы можете попробовать сделать это с помощью пользовательского Manager Возможно, вы должны попытаться создать пользовательский диспетчер с переопределен get_query_set() метода, как описан here

0

Есть несколько способов, которые вы можете добавить и дополнительный атрибут к классу. Если его атрибут, который можно вычислить только один раз и использовать в качестве «только для чтения» с этого момента, я предлагаю использовать декоратор .

Например:

@property 
def foo(self): 
    bar = do_some_calculation() 
    return bar 

Но это не будет возможным в тех случаях, когда вы хотите, чтобы проверить количество определенного типа объекта, потому что он будет меняться с течением времени.

Функции менеджера должны использоваться для возврата набора объектов. Если вы хотите вернуть булево значение, указывающее, имеет ли пост более 4 комментария, вы можете добавить функцию в модели:

def more_than_4_replies(self): 
    return self.objects.count() > 4 

И вы также можете использовать агрегацию аннотировать объект установить передаваемую в шаблон и используйте расширенный тег, например, smart-if или pyif.

Смежные вопросы