簡體   English   中英

Django模型外鍵查詢

[英]Django model foreignkey queries

所以我在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)

我不知道錯誤在哪里,而且我似乎無法捕捉到異常(即在docker中使用django)

tl; dr

這樣的事情應該起作用。

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()更多信息,請參見此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM