from django.db import modelsfrom django.contrib.auth.models import Userfrom django.contrib.contenttypes.fields import GenericForeignKeyfrom django.contrib.contenttypes.models import ContentType
from .fields import OrderField
# Create your models here.
class Subject(models.Model):    title = models.CharField(max_length=200)    slug = models.SlugField(max_length=200, unique=True)
    class Meta:        ordering = ['title']
    def __str__(self):        return self.title
class Course(models.Model):    owner = models.ForeignKey(User, related_name='courses_created', on_delete=models.CASCADE)    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, related_name='courses')    title = models.CharField(max_length=200)    slug = models.SlugField(max_length=200, unique=True)    overview = models.TextField()    created = models.DateTimeField(auto_now_add=True)
    class Meta:        ordering = ['created']
    def __str__(self):        return self.title
class Module(models.Model):    course = models.ForeignKey(        Course, related_name='modules', on_delete=models.CASCADE    )    title = models.CharField(max_length=200)    description = models.TextField(blank=True)    order = OrderField(blank=True, for_fields=['course'])
    class Meta:        ordering = ['order']
    def __str__(self):        return f'{self.order}. {self.title}'
class Content(models.Model):    module = models.ForeignKey(Module, related_name="contents", on_delete=models.CASCADE)    content_type = models.ForeignKey(        ContentType,        on_delete=models.CASCADE,        limit_choices_to={            'model__in': ('text', 'video', 'image', 'file')        }    )    object_id = models.PositiveIntegerField()    item = GenericForeignKey('content_type', 'object_id')    order = OrderField(blank=True, for_fields=['module'])
    class Meta:        ordering = ['order']
class ItemBase(models.Model):    owner = models.ForeignKey(User, related_name='%(class)s_related', on_delete=models.CASCADE)    title = models.CharField(max_length=250)    created = models.DateTimeField(auto_now_add=True)    updated = models.DateTimeField(auto_now=True)
    class Meta:        # 如果不设置 abstract = True 会有什么影响?        abstract = True
    def __str__(self):        return self.title
class Text(ItemBase):    content = models.TextField()
class File(ItemBase):    file = models.FileField(upload_to='files')
class Image(ItemBase):    file = models.ImageField(upload_to='images')
class Video(ItemBase):    url = models.URLField()
评论