2

Django でオンラインの私立学校のモデルを設計したいと思います。StudentsTutorsとの関係に焦点を当てていCoursesます。

考慮すべき最も重要な要素は、コース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これは非常に基本的な例ですが、データベースに関する限り、これは依然として 1 つの例ですが、それ自体を一意にするメソッドをオーバーライドおよび追加できることを示すためのものです。

もちろん、 aStudentを aTutorや通常の old と区別する何らかの方法が必要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.objects.all()のみが取得されます。User

これらは個別のモデルであるため、admin で個別に参照することもできます。したがって、必要に応じて、 、 、および通常の ごとに個別の変更リストと変更フォームを作成StudentできTutorますUser

それらをグループに割り当てると、管理者の一部を非常に簡単に制限することもできます. たとえば、 のみTutorがコースを作成、変更、または削除できる必要があるため、次のメソッドを に追加できます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検討しますまた、認証モジュールにはかなり完全な権限モデルがあり、独自のシステムを作成する代わりに使用して、一部のユーザーのみがコースを作成できるようにすることができます。Tutor

于 2012-06-13T16:37:21.960 に答える