django學習——Model模型中多對多外來鍵如何查詢
阿新 • • 發佈:2019-02-11
在學習django時,首先需要設計的就是模型,模型包括一對多及多對多關係,這裡以Course與User兩個模型為例來解釋下多對多關係,以及查詢方式。
首先建立模型:
class Course(models.Model):
name = models.CharField(max_length=20, verbose_name='課程名稱')
desc = models.TextField(verbose_name='課程描述')
class User(models.Model):
name = models.CharField(max_length=20, verbose_name ='姓名')
age = models.IntegerField(verbose_name='年齡', default=18)
因為每一個使用者可以學習多門課程,且每一門課程可以被多名使用者學習,因此使用者與課程之間的關係是多對多的關係。此時,單獨在Course下面用外來鍵,或者在User下面用外來鍵,將兩者連線起來是不對的。可以採取在建立一個UserCourse模型的方式將兩者聯絡起來。
class UserCourse(models.Model):
user = models.ForeignKey(User, verbose_name='使用者')
course = models.ForeignKey (Course, verbose_name='課程')
當某使用者學習了某課程時,可以通過新增UserCourse,來將兩者記錄下來。
user_course = UserCourse()
user_course.user = request.user
user_course.course_id = course_id
user_course.save()
即可。
而在實際中,我們經常需要查詢某個使用者學習過的課程,此時,可以在User模型下面新增一個函式,即可:
class User(models.Model):
name = models.CharField(max_length=20 , verbose_name='姓名')
age = models.IntegerField(verbose_name='年齡', default=18)
def get_user_course(self):
#查詢該使用者學過的所有課程
return self.usercourse_set.all()
函式返回的是UserCourse中的QuerySet
for迴圈即可得到該使用者學過的所有課程的名稱。
user = request.user
for user_course in user.get_user_course:
course_name = user_course.course.name
同樣,在Course下也可以定義學習過該課程的所有使用者:
class Course(models.Model):
name = models.CharField(max_length=20, verbose_name='課程名稱')
desc = models.TextField(verbose_name='課程描述')
def get_course_user(self):
#獲取學習過該課程的所有使用者
return self.usercourse_set(all)
需要注意的是,UserCourse模型最好建立在另一個單獨的app中。