lack of foreign key in admin model?

Question:

I get the following error when trying to update my database:

class ‘artdb.admin.RoleInline’: (admin.E202) ‘artdb.Role’ has no ForeignKey to ‘artdb.Person’

I want ot have a many to many relation between Person and Role

model.py (not showing all classes):

class Person(models.Model):
    mail=models.EmailField()
    firstName=models.CharField(max_length=200)
    lastName=models.CharField(max_length=200)
    phoneNumber=PhoneNumberField()
    streetAdress=models.CharField(max_length=200)
    zipcode=models.CharField(max_length=200)
    city=models.CharField(max_length=200,default="Göteborg")
    country=models.CharField(max_length=200,default="Sweden")
    
    def __str__(self):
        return "%s %s" % (self.firstName,self.lastName)

    class Meta:
        ordering = ('firstName','lastName')

class Role(models.Model):
    role=models.CharField(max_length=200)
    person=models.ManyToManyField(Person)
    
    def __str__(self):
        return self.role

    class Meta:
        ordering = ('role',)

admin.py (not showing all classes):

from django.contrib import admin
from .models import Role
from .models import Address
from .models import Date
from .models import Person
from .models import Name

# Register your models here.

admin.site.register(Role)
admin.site.register(Address)
admin.site.register(Date)
admin.site.register(Name)
admin.site.register(Person)

class RoleInline(admin.TabularInline):
    model=Role
    extra=3

class PersonInline(admin.ModelAdmin):
    fieldsets=[
        (None,{'fields': ['mail','firstName','lastName','phoneNumber','streetAdress','zipcode','city','country']}),
    ]
    inlines = [RoleInline]
    search_fields = ['firstName']

#admin.site.register(Name,NameInline)
admin.site.register(Person,PersonInline)

it has worked before with run manage.py makemigrations artdb
I don’t see the errorin the models.

Asked By: Jonas Fredriksson

||

Answers:

You are having wrong model for RoleInline as per documentation for ManytoMany relationship in TabularInline

 model = Role.persons.through
Answered By: iklinac

You need to use model=Role.person.through instead of model=Role as shown below:

class RoleInline(admin.TabularInline):
    # model=Role
    model=Role.person.through # Here
    extra=3
Answered By: Kai – Kazuya Ito