2013-05-10 5 views
4

у меня есть простая модель с Model Manager:Джанго модель не сохраняется, но возвращает None

class CompanyReviewManager(models.Manager): 
    def get_votes_for_company(self, company): 
     try: 
      return CompanyReview.objects.filter(user = user).count() 
     except ObjectDoesNotExist: 
      return None 

    def get_rating_for_field(self, installer, field): 
     try: 
      return CompanyReview.objects.filter(user = user).aggregate(Avg(field)) 
     except ObjectDoesNotExist: 
      return None 

class CompanyReview(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    satisfaction = models.PositiveSmallIntegerField(blank = True, null = True,) 
    comments = models.TextField(blank = True, null = True,) 

    objects = CompanyReviewManager() 

    def save(self, *args, **kwargs): 
     obj = super(InstallerReview, self).save(*args, **kwargs) 
     return obj 

Когда я теперь пытаюсь сохранить объект в Django оболочки, объект будет сохранен, но ничего будут возвращены. Зачем?

In [1]: company_obj = InstallerReview() 
In [2]: company_obj.user = CompanyUser.objects.all()[2] 
In [3]: obj = company_obj.save() 
In [4]: obj 
Out[4]: 
In [5]: company_obj 
Out[5]: <CompanyReview: AdminCompany> 

Почему третий шаг неудачу без ошибок?

+0

@ Урда Мне может быть что-то не хватает, но я не вижу, как это особенно связано с 1.5. И почему добавление «Django» в названии? Он уже помечен как вопрос Django. – Anto

ответ

19

Потому что суперкласс save метод ничего не возвращает. Ему не нужно: self сохраняется, нет смысла возвращать что-то еще и называть его obj.

Вы можете просто вернуть self из вашего подкласса save метода, но там не так много. Как правило, в Python, если функции меняют объекты на месте, они не возвращают измененный объект: сравните с методом sort().

+5

@ danielroseman: ты когда-нибудь спишь? Чтение вопросов, чтобы узнать, что вы уже пришли с идеальным ответом, становится немного скучным;) –

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