2010-04-22 5 views
5

Mam model, który można dołączyć do innych modeli.Django generyczne pole relacji zgłasza, że ​​all() otrzymuje nieoczekiwany argument słowa kluczowego, gdy nie są przekazywane żadne argumenty.

class Attachable(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_pk = models.TextField() 
    content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk") 

    class Meta: 
     abstract = True 

class Flag(Attachable): 
    user = models.ForeignKey(User) 
    flag = models.SlugField() 
    timestamp = models.DateTimeField() 

Tworzę ogólny związek z tym modelem w innym modelu.

flags = generic.GenericRelation(Flag) 

Staram się przedmiotów od typowego stosunku tak:

self.flags.all() 

Skutkuje to następującym wyjątkiem:

>>> obj.flags.all()   
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 105, in all 
    return self.get_query_set()                
    File "/usr/local/lib/python2.6/dist-packages/django/contrib/contenttypes/generic.py", line 252, in get_query_set 
    return superclass.get_query_set(self).filter(**query)               
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 498, in filter      
    return self._filter_or_exclude(False, *args, **kwargs)               
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 516, in _filter_or_exclude   
    clone.query.add_q(Q(*args, **kwargs))                   
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1675, in add_q     
    can_reuse=used_aliases)                      
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1569, in add_filter   
    negate=negate, process_extras=process_extras)                 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 1737, in setup_joins   
    "Choices are: %s" % (name, ", ".join(names)))                 
FieldError: Cannot resolve keyword 'object_id' into field. Choices are: content_type, flag, id, nestablecomment, object_pk, timestamp, user 
>>> obj.flags.all(object_pk=obj.pk) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
TypeError: all() got an unexpected keyword argument 'object_pk' 

Co zrobiłem źle?

Odpowiedz

7

Trzeba zdefiniować object_id_field i content_type_field podczas tworzenia GenericRelation:

flags = generic.GenericRelation(Flag, object_id_field="object_pk", content_type_field="content_type") 
+0

nie zdawał sobie sprawy, używałem innych niż domyślne wartości dla ct_field i fk_field. Dzięki. – Joshua

+0

świetny post! dzięki – Ron

Powiązane problemy