Django 1.0 中的通用外键和 get_or_create:坏了吗?

1 投票
1 回答
1042 浏览
提问于 2025-04-15 14:45

你可以看到,create()这个方法可以正常工作,但get_or_create()却不行。我是不是漏掉了什么明显的东西呢?

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

1 个回答

2

看起来在 createget_or_create 这两个方法中使用的逻辑不太一样。在 get_or_create 中,没有 source 这个参数,而是有 src_object_idsrc_content_type。不过,这个问题很容易解决,你只需要把 src_object_id 传入为 u.id,把 src_content_type 传入为 u.content_type(目标部分也是一样的)。

或者你可以使用 try/exceptcreate 方法。

撰写回答