如何从django中的外部模型访问变量

How to access variables from foreign models in django

我刚开始使用 django,python 请耐心等待。 (只是个新手) 我有 3 个模型程序、模块和讲座。 程序有一个变量 'code',它是模块的外键。 模块依次还有一个变量 'code',它是讲座的外键。

在lecture中,我实现了一个函数来获取上传文件的动态路径,基于程序的'code',模块的'code'和lecture的'title'。

这是我的 models.py

的片段
from django.db import models

class Programme(models.Model):
    code = models.CharField(blank=True, max_length=20, primary_key=True)
    title = models.CharField(blank=True, max_length=120)
    synopsis = models.TextField(blank=True)
    pub_date = models.DateTimeField(blank=True, auto_now=False, auto_now_add=True)

    def get_programme_code(self):
        return self.code

    def __str__(self):
        return self.title

class Module(models.Model):
    code = models.CharField(blank=True, max_length=20, primary_key=True)
    programme = models.ForeignKey(Programme, on_delete=models.CASCADE)
    title = models.CharField(blank=True, max_length=120)
    synopsis = models.TextField(blank=True)
    pub_date = models.DateTimeField(blank=True, auto_now=False, auto_now_add=True)

    def get_module_code(self):
        return self.code

    def __str__(self):
        return self.title

class Lecture(models.Model):

    def get_upload_to(self):
        return 'uploads/%s/%s/%s/%s' % (Programme().get_programme_code(),Module().get_module_code,self.title,filename)

    title = models.SlugField(max_length=100)
    module = models.ForeignKey(Module, on_delete=models.CASCADE)
    lecture_pdf = models.FileField(upload_to=get_upload_to)
    lecture_video = models.FileField(upload_to=get_upload_to)

    def __str__(self):
        return self.title

我知道我的代码通过从程序和模块访问 'code' 的方式有问题,但我无法弄清楚。

这是我对模型进行单元测试的片段。

   from django.test import TestCase
    from module_content.models import Programme, Module, Lecture
    from django.utils import timezone
    from django.core.urlresolvers import reverse

    class ProgrammeTest(TestCase):

        def create_programme(self, code="E318", title="Computer Science",       synopsis="Englobes all computer related fields"):
            return Programme.objects.create(code =code, title=title, synopsis=synopsis, pub_date=timezone.now())

        def test_programme_creation(self):
            t = self.create_programme()
            self.assertTrue(isinstance(t, Programme))
            self.assertEqual(t.__str__(), t.title)

        def test_get_programme_code(self):
            t = self.create_programme()
            self.assertEqual(t.get_programme_code(), t.code)


    class ModuleTest(TestCase):

        def create_module(self, code="CSE2233", title="Computer Networks", synopsis="About data transmission"):
            v = ProgrammeTest().create_programme()
            return Module.objects.create(code=code, programme=v, title=title, synopsis=synopsis, pub_date=timezone.now())

        def test_module_creation(self):
            t = self.create_module()
            self.assertTrue(isinstance(t, Module))
            self.assertEqual(t.__str__(), t.title)


    class LectureTest(TestCase):

        def create_lecture(self, title="Lecture 1"):
            t = ModuleTest().create_module()
            return Lecture.objects.create(title=title, module=t)

        def test_lecture_creation(self):
            s = self.create_lecture()
            self.assertTrue(isinstance(s, Lecture))
            self.assertEqual(s.__str__(), s.title)

        def test_get_upload_to(self):
            s = self.create_lecture()
            self.assertEqual( s.get_upload_to(), 'uploads/E318/CSE2233/lecture-1')

我把 lecture 的标题字段设置为 slugfield,那么 django 会自动将它设置为 slug 吗? 我尝试了 slugfield,它只是 return 标题 "Lecture 1" 而不是 "lecture-1",或者我可能遗漏了什么。

那么如何从模型中访问外键并测试动态上传路径是否正常工作?

我只需要通过外键访问其他模型,例如 self.module.programme.code - 以检索程序代码。