【问题标题】:How to access variables from foreign models in django如何在 django 中访问来自外国模型的变量
【发布时间】:2016-06-25 01:13:45
【问题描述】:

我刚开始使用 django 和 python,所以请多多包涵。 (只是一个新手) 我有 3 个模型程序、模块和讲座。 程序有一个变量“代码”,它是模块的外键。 模块反过来也有一个变量“代码”,它是讲座的外键。

在讲座中,我实现了一个函数,可以根据程序的“代码”、模块的“代码”和讲座的“标题”来获取上传文件的动态路径。

这是我的 models.py 的 sn-p

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

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

这是我对模型的单元测试的 sn-p。

   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')

我将讲座的标题字段设置为 slugfield,那么 django 会自动将其设置为 slug 吗? 我尝试了 slugfield,它只是将标题返回为“Lecture 1”而不是“lecture-1”,或者我可能遗漏了一些东西。

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

【问题讨论】:

    标签: unit-testing python-3.x django-models upload foreign-keys


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2016-04-14
      • 2012-03-31
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多