gpt4 book ai didi

database - 在Django ORM中,A "Student - Course"模型设计

转载 作者:搜寻专家 更新时间:2023-10-30 22:01:52 25 4
gpt4 key购买 nike

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

应该考虑的最重要的因素是Students可以添加和Tutors可以创建类(class)。

我想扩展内置 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)

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

第二,如何查询哪个学生选了哪些类(class)?

先谢谢你..

最佳答案

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

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

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

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

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

当然,您需要一些方法来区分 StudentTutor,甚至是普通的 User。我发现组是为 User 代理完成此操作的最佳方式。例如,您可以创建“Student”和“Tutor”组,然后分配给“Student”组的任何用户都可以通过 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 的对象(例如 Student .objects.all()),你只会得到属于“Student”组的 User

因为这些是单独的模型,您也可以在管理中单独引用它们,因此您可以为 StudentTutor 拥有单独的更改列表和更改表单,如果需要,对于普通的 User

将它们分配到组中也可以很容易地限制部分管理员。例如,由于只有 Tutor 应该能够创建、更改或删除类(class),您可以将以下方法添加到您的 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()

并且只有 super 用户或“导师”组的成员才能添加全新类(class)或更改或删除现有类(class)。

关于database - 在Django ORM中,A "Student - Course"模型设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11019346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com