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()
评论