MinMaxing
MinMaxing

Reputation: 27

Through model in Django

I am getting errors while I am building the following database. Idea is that you create a Team object. Create Student Objects and link them to Teams. And then give the Students points through PointEntry objects. I want to relate the team given to each Student object in each PointEntry Object. But for some reason, Django gives the error:

score_board.Student: (fields.E336) The model is used as an intermediate model by 'score_board.PointEntry.team', but it does not have a foreign key to 'PointEntry' or 'Team'.

Modeladmin Class

class StudentAdmin(admin.ModelAdmin):
    list_display = ['name', 'team']
    list_filter = ['team']
class PointEntryAdmin(admin.ModelAdmin): 
    list_display = ['student', 'points'] 
    list_filter = ['student'] 

Below are the models

class Team(models.Model):
    # Team/group model
    name = models.CharField(max_length=64)

class Student(models.Model):
    # Student model
    name = models.CharField(max_length=64)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.name}"

class PointEntry(models.Model):
    # Point entry's made by users appointed to a student in a group
    student = models.OneToOneField(Student, on_delete=models.CASCADE)
    points = models.IntegerField()
    team = models.ManyToManyField(Team, through='Student')

Upvotes: 1

Views: 925

Answers (2)

prathap sagar
prathap sagar

Reputation: 121

      class Team(models.Model):
      # Team/group model
     name = models.CharField(max_length=64)
      student = models. models.ManyToManyField(Student,through='PointEntry ')


  class Student(models.Model):
   # Student model
name = models.CharField(max_length=64)
team = models. models.ManyToManyField(Team,through='PointEntry')

  def __str__(self):
    return f"{self.name}"

 class PointEntry(models.Model):
# Point entry's made by users       appointed to a student in a group
  student = models.  ForeignKey(Student,on_delete=models.CASCADE)
  team = models. ForeignKey(Team,   on_delete=models.CASCADE)
  points = models.IntegerField()   

I think a model like this might work for what you’re trying to achieve.

Upvotes: 0

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477210

Your through model needs a ForeignKey to both models. Since the model that defines the ManyToManyField is defined lower, you can not reference to the class. But in Django, you can also use a string literal:

class Student(models.Model):
    name = models.CharField(max_length=64)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)
    pointentry = models.ForeignKey('PointEntry', on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.name}'

class PointEntry(models.Model):
    # Point entry's made by users appointed to a student in a group
    student = models.OneToOneField(Student, on_delete=models.CASCADE)
    points = models.IntegerField()
    team = models.ManyToManyField(Team, through='Student')

Django will then replace the string with a reference to the class.

Upvotes: 1

Related Questions