Django admin ManyToMany inline erro “não tem ForeignKey para”

93

Estou configurando o administrador Django para os seguintes modelos:

class Quote(models.Model):                                                  
    author = models.CharField(max_length=100)                               
    quote = models.CharField(max_length=1000)                               
    tags = models.ManyToManyField('Tag')                                    

class Tag(models.Model):                                                    
    name = models.CharField(max_length=100)                                 

Com o seguinte código:

class TagInline(admin.TabularInline):                                                                                               
    model = Tag                                                             

class QuoteAdmin(admin.ModelAdmin):                                         
    list_display = ('author', 'quote')                                      
    inlines = (TagInline,)                                                  

class TagAdmin(admin.ModelAdmin):                                           
    pass                                                                    

admin.site.register(Quote, QuoteAdmin)                                      
admin.site.register(Tag, TagAdmin)

Ao tentar visualizar a página de administração para adicionar um Quote, a página mostra um erro dizendo <class 'quotes.models.Tag'> has no ForeignKey to <class 'quotes.models.Quote'>. Isso não aconteceu antes de eu adicionar um embutido. Qual é o problema? Como adiciono corretamente a Tagcomo embutido?

(Passei uns bons 20 minutos procurando uma resposta; encontrei perguntas semelhantes, mas nenhuma das respostas funcionou para mim.)

Humphrey Bogart
fonte

Respostas:

158

A documentação do administrador tem uma seção dedicada a inlining com relacionamentos muitos para muitos. Você deve usar Quote.tags.throughcomo modelo para TagInline, em vez de Tagsi mesmo.

Cat Plus Plus
fonte
Se eu tenho um modal que tem muitos manytomany field, isso significa que para cada um ele precisa de um Inlinee eles são diferentes?
Sinux
4
@Rmatt Para relações muitos para muitos revertidas model = Tag.quote_set.related.through
Manh Tai
Existe um truque para fazer o modelo de passagem aparecer como um campo de id bruto em vez de listar uma linha muito possível no banco de dados?
mlissner
e é por isso que eu começo a amar Django
Daniel W.