2

我想在 Django 中为一所在线私立学校设计一个模型。它侧重于和之间Students的关系。TutorsCourses

应该考虑的最重要的因素是Students可以添加和Tutors创建课程。

我想扩展内置的 Djano 的“用户”并扩展它的功能。

我设计了一个非常草稿的模型,如下所示:

from django.db import models
from django.contrib.auth.models import User , Group
from django.utils.translation import ugettext as _


class Course(models.Model):
    name = models.CharField(max_length = 70)
    slug = models.SlugField()
    created = models.DateTimeField(auto_now = True)
    updated = models.DateTimeField(auto_now_add = True)
    description = models.TextField()
    student = models.ManyToManyField('Student' , null = True, blank = True, related_name = _('Student courses'))
    tutor = models.ManyToManyField('Tutor' , null = True, blank = True , related_name = _('Tutor courses'))


    def __unicode__(self):
        return self.name

    class Meta:
        verbose_name = ('course')
        verbose_name_plural = ('courses')


class Student(models.Model):
    user = models.ForeignKey(User , blank = True)
    #photo = models.ImageField(_('photo'), upload_to='photos/', blank=True)



class Tutor(models.Model):
    user = models.ForeignKey(User , blank = True)
    #photo = models.ImageField(_('photo'), upload_to='photos/', blank=True)

首先:这是一个正确的方法吗?我想要用户,所以我可以在视图和模板层中使用它。

第二,如何查询哪个学生上过哪些课程?

提前谢谢你..

4

2 回答 2

4

正如@cberner 所说,您应该查看用户配置文件。归根结底,您希望学生和导师都是真正的蓝色User,这样您就可以在他们登录后从请求中访问他们。

话虽如此,拥有单独的模型仍然有一些优点,只要它们是代理模型。您可以将代理模型视为一种别名。他们不能向数据库中添加额外的字段,但他们可以拥有自己独特的方法、管理器等。例如:

class Student(User):
    class Meta:
        proxy = True

    def __unicode__(self):
        return u'Student: %s' % super(Student, self).__unicode__()

这是一个非常基本的示例,但它旨在说明即使User就数据库而言这仍然是一个,您可以覆盖和添加使其本身独一无二的方法。

当然,不过,您需要一些方法来区分 aStudent和 aTutor甚至是普通的 old User。我发现组是为User代理完成此任务的最佳方式。例如,您可以创建“学生”和“导师”组,然后分配到“学生”组的任何用户,例如,都可以通过Student模型获得。

class StudentManager(models.Manager):
    def get_query_set(self):
        return self.filter(groups__name='Student')

class Student(User):
    class Meta:
        proxy = True

    def save(self, *args, **kwargs):
        super(Student, self).save(*args, **kwargs)
        if not self.groups.filter(name='Student').exists():
            group, created = Group.objects.get_or_create('Student')
            self.groups.add(group)

这确保了任何时候您创建一个Student,它都会自动添加到“学生”组,并且如果您使用Student(例如Student.objects.all())检索对象,您只会获得User属于“学生”组的 s。

因为这些是单独的模型,您也可以在管理员中单独引用它们,因此您可以拥有单独的更改列表和更改表单 a Student、 aTutor和常规User(如果需要)。

将它们分配给组也可以很容易地限制部分管理员。例如,由于只有Tutors 应该能够创建、更改或删除课程,因此您可以将以下方法添加到您的CourseAdmin:

def has_add_permission(self, request):
    return request.user.is_superuser or request.user.groups.filter(name='Tutor').exists()

def has_change_permission(self, request, obj=None):
    return request.user.is_superuser or request.user.groups.filter(name='Tutor').exists()

def has_delete_permission(self, request, obj=None):
    return request.user.is_superuser or request.user.groups.filter(name='Tutor').exists()

只有超级用户或“导师”组的成员才能添加全新的课程或更改或删除现有课程。

于 2012-06-13T17:21:09.497 回答
2

我会考虑使用Django 支持的用户配置文件,而不是使用Student和模型。此外,auth 模块具有相当完整的权限模型,您可以使用它而不是创建自己的系统来仅允许某些用户创建课程。Tutor

于 2012-06-13T16:37:21.960 回答