简体   繁体   中英

How to Connect a Django Model with ManyToMany Relationship?

I am making an app that is pretty much similar to google classroom in django.

I have a Course model and an assignment model, and I want to connect an assignment to the specified course.

These are my models

class Assignment(models.Model):
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    date_created = models.DateTimeField(default=timezone.now)


class Course(models.Model):
    title = models.CharField(max_length=100)
    subject = models.CharField(max_length=100)
    image = models.ImageField(default='no_course_image.jpg', upload_to='course_images')
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    students_invited = models.ManyToManyField(User, null=True, blank=True)
    assignments = models.ManyToManyField(Assignment, null=True, blank=True)
    date_published = models.DateTimeField(default=timezone.now)

    class Meta:
        verbose_name_plural = 'Course'
        ordering = ['-date_published']
    
    def __str__(self):
        return '{} - {}'.format(self.title, self.owner)

But i am getting an error when I specify the course field in the assignment model with the ForeignKey? Could you please help me with how to connect the assignment to the Course model? Thank you

When you try to create the Model Assignment with reference to the model Course , the Course Model has not yet created and vice versa and you will get an error either of the model is not defined

  1. You can use the quotes for it
class Assignment(models.Model): course = models.ForeignKey('Course', on_delete=models.CASCADE) name = models.CharField(max_length=100) date_created = models.DateTimeField(default=timezone.now)
  1. You can use a custom through model enter link description here

ForeignKey is used to setup a many to one relationship. As you are trying to setup a ManyToManyField it won't work in this situation as you can see in the Django documentation

ForeignKey¶

class ForeignKey(to, on_delete, **options)¶
A many-to-one relationship. Requires two positional arguments: 
the class to which the model is related and the on_delete option.

In fact you don't even need to set the relation in the Assignment Model as Django will take care of creating a third table linking the two together by their primary keys. You can see this in the documentation

from django.db import models

class Publication(models.Model):
    title = models.CharField(max_length=30)

    class Meta:
        ordering = ['title']

    def __str__(self):
        return self.title

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

    class Meta:
        ordering = ['headline']

    def __str__(self):
        return self.headline

So every time you add the assignment to the course like so

>>> c1 = Course(title='Python Course')
>>> c1.save()
>>> a1 = Assignment(name='Python Assignment')
>>> a1.save()
>>> c1.assignments.add(a1)

And the relation will automatically be created and c1.assignments.all() will return all the assignments linked to the course

If you need to go the other way around then you would use a1.course_set.add(c1) . When using the model that doesn't have the ManyToManyField object tied to it you need to use the *_set notation where * will be replaced by the model name in lower case. Can read more about Related Objects references in the docs here

I guess the Course model has to be written before the Assignment model.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM