1. 程式人生 > >django學習——Model模型中多對多外來鍵如何查詢

django學習——Model模型中多對多外來鍵如何查詢

在學習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中。