Django admin ManyToMany inline błąd „nie ma klucza obcego do”

92

Konfiguruję administratora Django na następujące modele:

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)                                 

Z następującym kodem:

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)

Podczas próby wyświetlenia strony administratora w celu dodania a Quote, strona wyświetla komunikat o błędzie <class 'quotes.models.Tag'> has no ForeignKey to <class 'quotes.models.Quote'>. Nie wydarzyło się to, zanim dodałem inline. Jaki jest problem? Jak poprawnie dodać Tagjako inline?

(Spędziłem dobre 20 minut na poszukiwaniu odpowiedzi; znalazłem podobne pytania, ale żadna z ich odpowiedzi nie zadziałała.)

Humphrey Bogart
źródło

Odpowiedzi:

153

Dokumentacja administratora zawiera sekcję poświęconą dołączaniu relacji wiele-do-wielu. Powinieneś używać go Quote.tags.throughjako modelu TagInlinezamiast Tagsiebie.

Cat Plus Plus
źródło
Jeśli mam modal, który ma wiele manytomany field, to znaczy, że dla każdego potrzebuje a Inlinei są różne?
Sinux
4
@Rmatt Odwrócenie relacji wiele-do-wielu model = Tag.quote_set.related.through
Manh Tai
Czy istnieje sztuczka, dzięki której model przelotowy pojawia się jako surowe pole identyfikatora zamiast wymieniać bardzo możliwy wiersz w bazie danych?
mlissner
i dlatego zaczynam kochać Django
Daniel W.