2017-03-08 156 views
0

所以我要在Django這兩種型號:Django的模型外鍵查詢

class Course(models.Model): 

    def get_image_path(self, filename): 
     return os.path.join('courses', str(self.slug), filename) 

    def __str__(self): 
     return self.name 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     super(Course, self).save(*args, **kwargs) 

    name = models.CharField(max_length=255, verbose_name="Nombre") 
    description = models.CharField(max_length=255,  verbose_name="Descripción") 
    price = models.DecimalField(max_digits=12,decimal_places=2, verbose_name="Precio") 
    slug = models.SlugField(blank=True, max_length=255) 
    icon_img = models.ImageField(upload_to=get_image_path, blank=True, null=True, verbose_name="Imagen") 
background_color = ColorField(default="#026085") 


    class Meta: 
     verbose_name = "curso" 
     verbose_name_plural = "cursos" 

class UserCourse(models.Model): 
    user = models.ForeignKey(User) 
    course = models.ForeignKey(Course) 

所以每當一個用戶「購買」的課程,它存儲在UserCourse。我有一個觀點,系統顯示用戶購買的所有課程列表。這是視圖代碼:

def user_course_list_view(request, username): 
    context_dict = {} 
    try: 
     user_courses = UserCourse.objects.filter(user=request.user).course_set 
     context_dict['courses'] = user_courses 
     context_dict['heading'] = "Mis cursos" 
    except: 
     context_dict['courses'] = None 
     context_dict['heading'] = "Mis cursos wey" 
    return render(request, 'courses/course_list.html', context=context_dict) 

我不知道哪裏是錯誤,我似乎無法捕捉到了異常

+0

'UserCourse.objects.filter(user = request.user).course_set'這是什麼意思?查詢集不會有一個名爲'course_set'的字段。在這種情況下,移除異常處理並查看代碼破壞的位置 – karthikr

+0

user_courses = UserCourse.objects.filter(user = request.user).course_set.all() 這是否適合您? – n1cko

回答

2

TL(使用泊塢窗的Django IM);博士

像這樣的東西應該工作。

usercourse_objects = UserCourse.objects.filter(user=request.user).select_related('course') 
user_courses = [x.course for x in usercourse_objects] 

說明

有多種方法可以做到這一點,但一個方法是先得到所有當前用戶的UserCourse對象:

usercourse_objects = UserCourse.objects.filter(user=request.user) 

然後,對每個UserCourse對象,獲取相關信息Course

user_courses = [x.course for x in usercourse_objects] 

現在,第二行會導致N個數據庫查詢(每次我們按照course外鍵關係進行查詢。爲了防止這種情況,第一行可以更改爲:

usercourse_objects = UserCourse.objects.filter(user=request.user).select_related('course') 

該預填充UserCourse對象的屬性course。有關select_related()的更多信息可以發現here