04.03.2010 14:58

  1. Здравствуйте!

    Возможно ли обновить поле связанного объекта через конструкцию F? У меня не получается:
    In [8]: Post.objects.filter(pk=172).update(event__posts_count = F('event.posts_count') -1)
    ---------------------------------------------------------------------------
    <class 'django.db.models.fields.FieldDoesNotExist'>Traceback (most recent call last)

    /home/greg/www/liveblogging/liveblog/<ipython console> in <module>()

    /usr/local/lib/python2.5/site-packages/django/db/models/query.py in update(self, **kwargs)
    444 "Cannot update a query once a slice has been taken."
    445 query = self.query.clone(sql.UpdateQuery)
    --> 446 query.add_update_values(kwargs)
    447 if not transaction.is_managed(using=self.db):
    448 transaction.enter_transaction_management(using=self.db)

    /usr/local/lib/python2.5/site-packages/django/db/models/sql/subqueries.py in add_update_values(self, values)
    131 values_seq = []
    132 for name, val in values.iteritems():
    --> 133 field, model, direct, m2m = self.model._meta.get_field_by_name(name)
    134 if not direct or m2m:
    135 raise FieldError('Cannot update model field %r (only non-relations and foreign keys permitted).' % field)
    /usr/local/lib/python2.5/site-packages/django/db/models/options.py in get_field_by_name(self, name)
    297 except KeyError:
    298 raise FieldDoesNotExist('%s has no field named %r'
    --> 299 % (self.object_name, name))
    300
    301 def get_all_field_names(self):

    <class 'django.db.models.fields.FieldDoesNotExist'>: Post has no field named 'event__posts_count'
    Или я не так составил запроc?
  2. В данном случае можно просто вызвать update для event'ов:

    Event.objects.filter(post=...).update(posts_count=F(...))
    
  3. Я в принципе так и сделал, думал можно через связную таблицу возможно. Спасибо!

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.