2017-01-13 8 views
3

Итак, вы понимаете, что внешний ключ, который у вас есть в вашей модели, действительно должен быть m2m, и вы приняли практику предоставления моделей. CASCADE как позиционный аргумент для внешнего ключа. Таким образом, вы в конечном итоге с этим кодом:Django ManyToManyField: объект «function» не подлежит индексированию

class Group(models.Model): 
    members = models.ManyToManyField(Person, models.CASCADE) 

Вы «починки» несколько других вещей, и вдруг в конечном итоге с этим хвостом трассировку со всем вы пытаетесь сделать:

File "/usr/local/lib/python3.5/site-packages/django/db/models/base.py", line 157, in __new__ 
    new_class.add_to_class(obj_name, obj) 
File "/usr/local/lib/python3.5/site-packages/django/db/models/base.py", line 316, in add_to_class 
    value.contribute_to_class(cls, name) 
File "/usr/local/lib/python3.5/site-packages/django/db/models/fields/related.py", line 1516, in contribute_to_class 
    elif self.remote_field.is_hidden(): 
File "/usr/local/lib/python3.5/site-packages/django/db/models/fields/reverse_related.py", line 144, in is_hidden 
    return bool(self.related_name) and self.related_name[-1] == '+' 
TypeError: 'function' object is not subscriptable 

Что происходит на?

+3

Возможно, настало время принять практику объявления 'on_delete' как ключевого слова arg – Sayse

+1

@Sayse является правильным. Я принимаю эту практику с этого момента, так как я просто сожгла час по этому вопросу. –

ответ

3

Подпись метода для ManyToManyField и ForeignKey не идентична. Позиционная аргумент ManyToManyField второй, на самом деле «related_name», что означает, что вы в конечном итоге прохождение models.CASCADE к related_name, как можно видеть в отладчике:

> /usr/local/lib/python3.5/site-packages/django/db/models/fields/related.py(1513)contribute_to_class() 
-> if self.remote_field.symmetrical and (
(Pdb) p self.remote_field.related_name 
<function CASCADE at 0x80645b400> 

Теперь положить пост это на вашем мониторе, причину через 3 месяца вы сделаете это снова.

+1

AAAARGH !! Определенно придерживайтесь этого на пост-он. Я пишу кучу этих, но я все равно просто потратил впустую час с этой ошибкой, пробираясь через код django, пытаясь понять, как вызываемый был передан как связанное имя. В качестве альтернативы ** всегда используйте kwarg для on_delete, а не для позиционного ** –