2009-10-02 10 views
1

Comme vous pouvez le constater, create() fonctionne, mais get_or_create() ne fonctionne pas. Est-ce que je manque quelque chose d'évident ici?Clés étrangères génériques et get_or_create dans django 1.0: Broken?

In [7]: f = FeedItem.objects.create(source=u, dest=q, type="greata") 

In [8]: f, created = FeedItem.objects.get_or_create(source=u, dest=q, type="greata") 
--------------------------------------------------------------------------- 
FieldError        Traceback (most recent call last) 

/Users/andrew/clownfish/panda-repo/community-feed/<ipython console> in <module>() 

/Library/Python/2.6/site-packages/django/db/models/manager.pyc in get_or_create(self, **kwargs) 

/Library/Python/2.6/site-packages/django/db/models/query.pyc in get_or_create(self, **kwargs) 

/Library/Python/2.6/site-packages/django/db/models/query.pyc in get(self, *args, **kwargs) 

/Library/Python/2.6/site-packages/django/db/models/query.pyc in filter(self, *args, **kwargs) 

/Library/Python/2.6/site-packages/django/db/models/query.pyc in _filter_or_exclude(self, negate, *args, **kwargs) 

/Library/Python/2.6/site-packages/django/db/models/sql/query.pyc in add_q(self, q_object, used_aliases) 

/Library/Python/2.6/site-packages/django/db/models/sql/query.pyc in add_filter(self, filter_expr, connector, negate, trim, can_reuse, process_extras) 

/Library/Python/2.6/site-packages/django/db/models/sql/query.pyc in setup_joins(self, names, opts, alias, dupe_multis, allow_many, allow_explicit_fk, can_reuse, negate, process_extras) 

FieldError: Cannot resolve keyword 'source' into field. Choices are: dest_content_type, dest_object_id, id, src_content_type, src_object_id, timestamp, type, weight 

Répondre

2

Regardez comme il y a une logique différente utilisée dans create et get_or_create comme dans get_or_create il n'y a aucun argument source mais src_object_id et src_content_type, mais il est facile de résoudre ce passe - scr_object_id comme u.id et src_content_type comme u.content_type (même avec dest) . Ou utiliser try/except & create.

+0

Faites attention à réimplémenter votre propre get_or_create en utilisant try/except et create. Il est très facile de créer une condition de concurrence qui entraînera des erreurs uniquement sous la charge simultanée en direct. Examinez la source get_or_create pour voir comment elle gère ce problème. –

Questions connexes