class catagory(MPTTModel): STATUS = (('true', 'true'), ('false', 'false')) parent = TreeForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE) title = models.CharField(max_length=30) keyword = models.CharField(max_length=255) description = models.CharField(max_length=255) image = models.ImageField(blank=True, upload_to='images/') status = models.CharField(max_length=10, choices=STATUS) slug = models.SlugField(null=False, unique=True) parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE) create_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) def __str__(self): return self.title class MPTTMeta: order_insertion_by = ['title'] def get_absolute_url(self): return reverse('category_detail', kwargs={'slug': self.slug}) def __str__(self): full_path = [self.title] k = self.parent while k is not None: full_path.append(k.title) k = k.parent return '/'.join(full_path[::-1])
class Category(MPTTModel): STATUS = ( ('True', 'Evet'), ('False', 'Hayır'), ) title = models.CharField(max_length=100) keywords = models.CharField(max_length=255) description = models.CharField(max_length=255) image = models.ImageField(blank=True, upload_to='images/') status = models.CharField(max_length=10, choices=STATUS) slug = models.SlugField(null=False, unique=True) parent = TreeForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE) create_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) class MPTTMeta: order_insertion_by = ['title'] def __str__(self): full_path = [self.title] k = self.parent while k is not None: full_path.append(k.title) k = k.parent return ' -> '.join(full_path[::-1]) def image_tag(self): return mark_safe('<img src="{}" height="50"/>'.format(self.image.url)) image_tag.short_description = 'Image' def get_absolute_url(self): return reverse('category_detail', kwargs={'slug': self.slug})
class Menu(MPTTModel): STATUS = (('True', 'Evet'), ('False', 'Hayır')) prent = TreeForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE) title = models.CharField(max_length=100) link = models.CharField(max_length=255) status = models.CharField(max_length=10, choices=STATUS) create_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) class MPTTMeta: order_insertion_by = ['title'] def __str__(self): full_path = [self.title] k = self.parent while k is not None: full_path.append(k.title) k = k.parent return '/'.join(full_path[::-1]) return self.title
class IndexInstanceNode(MPTTModel): parent = TreeForeignKey('self', null=True, blank=True) index_template_node = models.ForeignKey(IndexTemplateNode, related_name='node_instance', verbose_name=_('Index template node')) value = models.CharField(max_length=128, blank=True, verbose_name=_('Value')) documents = models.ManyToManyField(Document, related_name='node_instances', verbose_name=_('Documents')) def __unicode__(self): return self.value def index(self): return self.index_template_node.index @models.permalink def get_absolute_url(self): return ('indexing:index_instance_node_view', [self.pk]) @property def children(self): # Convenience method for serializer return self.get_children() class Meta: verbose_name = _('Index node instance') verbose_name_plural = _('Indexes node instances')
class MenuItem(MPTTModel): """ """ objects = MenuItemManager() published = PublishedManager() title = models.CharField(max_length=150) url = models.CharField(max_length=400, null=True, blank=True) parent = TreeForeignKey('self', null=True, blank=True, related_name='children', on_delete=models.CASCADE) target = models.PositiveSmallIntegerField( choices=settings.MENU_TARGET_CHOICES, default=settings.MENU_TARGET_SELF) sort_order = models.PositiveIntegerField() is_published = models.BooleanField(default=True) class Meta: verbose_name = "Menu Item" verbose_name_plural = "Menu Items" ordering = ['sort_order'] class MPTTMeta: order_insertion_by = ['sort_order'] def __unicode__(self): return self.title def save(self, *args, **kwargs): super(MenuItem, self).save(*args, **kwargs) MenuItem.objects.rebuild()
class Menu(MPTTModel): parent = TreeForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE) title = models.CharField(max_length=100, unique=True) link = models.CharField(max_length=100, blank=True) status = models.CharField(max_length=5, choices=STATUS) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class MPTTMeta: level_attr = 'mptt_level' order_insertion_by = ['title'] def __str__(self): full_path = [self.title] prnt = self.parent while prnt is not None: full_path.append(prnt.title) prnt = prnt.parent return ' -> '.join(full_path[::-1])
class Message(MPTTModel): TYPE_MESSAGE = 'message' TYPE_INVITATION = 'invitation' TYPE_INVITATION_RESPONSE = 'invitation_response' TYPES = ( (TYPE_MESSAGE, TYPE_MESSAGE), (TYPE_INVITATION, TYPE_INVITATION), (TYPE_INVITATION_RESPONSE, TYPE_INVITATION_RESPONSE), ) parent = TreeForeignKey('self', related_name='child', null=True, blank=True, db_index=True) recipient = models.ForeignKey(User, related_name='received_messages') sender = models.ForeignKey(User, related_name='sent_messages') is_read = models.BooleanField(default=False) content = models.TextField(default='', blank=True) type = models.CharField(max_length=30, choices=TYPES, default=TYPE_MESSAGE) created_date = models.DateTimeField(auto_now_add=True) modified_date = models.DateTimeField(auto_now=True) class MessageQuerySet(QuerySet): def my_last_replies(self, request): roots = Message.objects.root_nodes() my_roots = roots.filter( Q(sender=request.user) | Q(recipient=request.user)) leaves = [ root.get_descendants(include_self=True).last() for root in my_roots ] return Message.objects.filter(pk__in=[leaf.id for leaf in leaves]) objects2 = MessageQuerySet.as_manager()
class SystemConfig(MPTTModel, BaseModel, UsableStatus): name = models.CharField(u"键", max_length=255, unique=True) value = models.CharField(u"值", max_length=255) title = models.CharField(u"描述", max_length=255) parent = TreeForeignKey('self', verbose_name=u'父配置项', related_name='children', db_index=True, **DICT_NULL_BLANK_TRUE) status = models.PositiveSmallIntegerField(u'状态', choices=UsableStatus.STATUS, default=UsableStatus.USABLE, db_index=True) def __unicode__(self): return u"%s" % self.value def get_absolute_url(self): return reverse('adminlte:common_detail_page', kwargs={ 'app_name': self._meta.app_label, 'model_name': self._meta.model_name, 'pk': self.id }) class Meta: verbose_name_plural = verbose_name = u"参数配置" class MPTTMeta: order_insertion_by = ['name'] class Config: list_template_name = 'adminlte/systemconfig_list.html' list_display_fields = ('name', 'parent', 'value', 'title', 'id') list_form_fields = ('parent', 'name', 'value', 'title', 'id') search_fields = ('name', 'value', 'title')
class Category(MPTTModel): uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True) name = models.CharField(_('name'), max_length=40) parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True) channel = models.ForeignKey('Channel', verbose_name=_('channel'), related_name='categories') class Meta: verbose_name = _('category') verbose_name_plural = _('categories') def __str__(self): return self.name
class Comment(MPTTModel): """ 多级评论表 """ user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='user_comments') video = models.ForeignKey(Video, on_delete=models.CASCADE, related_name='video_comments', blank=True, null=True) parent = TreeForeignKey('self', on_delete=models.CASCADE, blank=True, null=True, related_name='replies') content = models.TextField() like_user = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='like_comments', blank=True) like_number = models.PositiveIntegerField(default=0) created = models.DateTimeField(auto_now_add=True, db_index=True) class MPTTMeta: order_insertion_by = ('-created', ) class Meta: verbose_name = '评论' verbose_name_plural = verbose_name def __str__(self): if self.parent is not None: return '{0} 回复 {1}'.format(self.user, self.parent.user) else: return '{0} 评论了 {1}'.format(self.user, self.video)
class IndexInstance(MPTTModel): parent = TreeForeignKey('self', null=True, blank=True, related_name='index_meta_instance') index = models.ForeignKey(Index, verbose_name=_(u'index')) value = models.CharField(max_length=128, blank=True, verbose_name=_(u'value')) documents = models.ManyToManyField(Document, verbose_name=_(u'documents')) def __unicode__(self): return self.value @models.permalink def get_absolute_url(self): return ('index_instance_list', [self.pk]) def get_document_list_display(self): return u', '.join([d.file_filename for d in self.documents.all()]) class Meta: verbose_name = _(u'index instance') verbose_name_plural = _(u'indexes instances')
class Comment(DateParent, MPTTModel): text = models.TextField() user_id = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True) # level = models.CharField(max_length=255, default='') # lft = models.CharField(max_length=255, default='') # rght = models.CharField(max_length=255, default='') # tree_id = models.IntegerField(default=1) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, related_name='comments') object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children') class MPTTMeta: order_insertion_by = ['date_create']
class Ranking(MPTTModel): name = models.CharField(max_length=50, verbose_name=u'名称') order = models.IntegerField(default=0, verbose_name=u'排序') status = models.IntegerField(default=1, verbose_name=u'状态') create_time = models.DateTimeField(auto_now_add=True, verbose_name=u'创建时间') update_time = models.DateTimeField(auto_now=True, verbose_name=u'修改时间') del_flag = models.IntegerField(default=0, verbose_name=u'删除') parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True) class Meta: db_table = "t_ranking" verbose_name = u"排行" verbose_name_plural = u"排行" def __unicode__(self): return self.name def get_top_three_books(self): return Book.objects.filter( rankingconfig__item=self).order_by('rankingconfig__order')[:3]
class Category(MPTTModel): STATUS = ( ('True', 'True'), ('False', 'False'), ) parent = TreeForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE) title = models.CharField(max_length=50) keywords = models.CharField(max_length=255) description = models.TextField(max_length=255) image = models.ImageField(blank=True, upload_to='images/') status = models.CharField(max_length=10, choices=STATUS) slug = models.SlugField(null=False, unique=True) create_at = models.DateTimeField(auto_now_add=True) update_at = models.DateTimeField(auto_now=True) def __str__(self): return self.title class MPTTMeta: order_insertion_by = ['title']
class ProjectModule(MPTTModel, BaseModel): """ 业务模块 """ parent = TreeForeignKey('self', verbose_name='上级业务模块', null=True, blank=True, related_name='children', db_index=True) name = models.CharField(max_length=255, blank=True, null=True, verbose_name="业务模块名称") class MPTTMeta: parent_attr = 'parent' def __str__(self): return self.name class Meta: verbose_name = "业务模块" verbose_name_plural = verbose_name
class Department(MPTTModel): """部门""" parent = TreeForeignKey('self', on_delete=models.CASCADE, related_name='child', verbose_name='父亲ID', null=True, blank=True) name = models.CharField(max_length=100, verbose_name='部门名称') desc = models.TextField(max_length=100, verbose_name='部门描述') is_active = models.BooleanField(default=True, verbose_name='是否激活') created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') has_child = JSONField(default=[], verbose_name='子级菜单') class Meta: verbose_name_plural = verbose_name = '菜单' class MPTTMeta: order_insertion_by = ['name'] def __str__(self): return self.name
class Category(MPTTModel): '''Модель категорий''' name = models.CharField(verbose_name='Имя', max_length=100) slug = models.SlugField("Url", max_length=100, unique=True) description = models.TextField('Описание', max_length=100, default='', blank=True) def __str__(self): return self.name class Meta: verbose_name= 'Категория' verbose_name_plural='Категории' parent = TreeForeignKey( 'self', verbose_name='Родительская категория', on_delete=models.CASCADE, null=True, blank=True, related_name='children' ) template = models.CharField('Шаблон', max_length=100, default='blog/post_list.html') published = models.BooleanField('Отображать?', default=True) paginated = models.PositiveIntegerField('Колличество новостей на странице', default=5) sort = models.PositiveIntegerField('Порядок', default=0) def get_absolute_url(self): return reverse('category', kwargs = {'category_slug': self.slug})
class Category(MPTTModel): title = models.CharField(max_length=120, verbose_name='Название') slug = models.SlugField(blank=True, max_length=120) image = models.ImageField(upload_to=category_photo, verbose_name='Изображение', blank=True, default='default/photo_product.jpg', max_length=500) author = models.ForeignKey(User, on_delete=models.DO_NOTHING, verbose_name="Автор", related_name='category') parent = TreeForeignKey('Category', on_delete=models.CASCADE, null=True, verbose_name="Родительская категория", blank=True, related_name='children') class MPTTMeta: order_insertion_by = ['id'] def save(self, *args, **kwargs): if self.pk is None: super(Category, self).save(*args, **kwargs) self.slug = create_slug(self.title, self.id) with Category.objects.disable_mptt_updates(): super(Category, self).save(*args, **kwargs) Category.objects.rebuild() def __str__(self): return self.title def get_absolute_url(self): return reverse('catalog', kwargs={'category': self.slug})
class MPTTSEOModel(SEOMixin, MPTTModel): name = models.CharField('Название', max_length=250, default='') slug = models.SlugField('URL', max_length=250, default='', blank=True) parent = TreeForeignKey('self', on_delete=models.CASCADE, related_name='children', blank=True, null=True, verbose_name='Родитель') url = models.CharField('Полный URL', max_length=255, default='', blank=True) class Meta: abstract = True def __str__(self): return self.name def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs)
class AssetCategory(MPTTModel, TimeTrackable, EditorTrackable, WithConcurrentGetOrCreate): name = models.CharField(max_length=50, unique=True) type = models.PositiveIntegerField( verbose_name=_("type"), choices=AssetCategoryType(), ) is_blade = models.BooleanField() parent = TreeForeignKey( 'self', null=True, blank=True, related_name='children', ) class MPTTMeta: order_insertion_by = ['name'] class Meta: verbose_name = _("Asset category") verbose_name_plural = _("Asset categories") def __unicode__(self): return self.name
class Ingredient(MPTTModel): name = models.CharField(max_length=64, unique=True) ubiquitous = models.BooleanField(default=False) # Add substitutes later? substitutes = models.ManyToManyField(to="self", related_name="substitutes", blank=True) parent = TreeForeignKey('self', blank=True, null=True, related_name='children', on_delete=SET_NULL) def object_already_in_family(self, field, object_id): family = self.get_ancestors() | self.get_children() filter_dict = {'id': object_id} for ingredient in family: if ingredient.__getattribute__(field).filter( **filter_dict).exists(): return True return False def __str__(self): return self.name class Meta: ordering = ('name', )
class Bookmark(MPTTModel): parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, on_delete=models.CASCADE) ordinal = models.IntegerField() title = models.CharField(max_length=300) class Meta: unique_together = (('parent', 'ordinal'), ) class MPTTMeta: order_insertion_by = ['ordinal'] def __str__(self): return self.title def get_absolute_url(self): return reverse('bookmarks:detail', args=[str(self.id)]) def walk(self): for c in self.get_children(): d = { 'title': c.title, 'ordinal': c.title, } l = list(c.walk()) if l: d['children'] = l l = list(c.rows.values_list('ordinal', flat=True)) if l: d['rows'] = l yield d
class CompanyStructure(MPTTModel): title = models.CharField('Название',max_length=100, unique=True, default=uuid.uuid4) parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True, verbose_name='Кому подчиняется') fo_department = models.ForeignKey('Department', on_delete=models.ProtectedError, verbose_name='Отдел', null=True, blank=True ) fo_book_position = models.ForeignKey('ReferenceBookPosition', on_delete=models.ProtectedError, verbose_name='Должность', null=True, blank=True ) fo_profile = models.ForeignKey('Profile', on_delete=models.ProtectedError, verbose_name='ФИО', null=True, blank=True ) @property def title_for_admin(self): return "%s %s %s" % (self.fo_department, self.fo_book_position, self.fo_profile) class MPTTMeta: order_insertion_by = ['title'] class Meta: verbose_name = 'Структура компании' verbose_name_plural = 'Структура компании' def __str__(self): return '%s %s %s' % (self.fo_department, self.fo_book_position, self.fo_profile)
class SwappedInModel(MPTTModel): parent = TreeForeignKey( 'self', null=True, blank=True, related_name='children', on_delete=models.CASCADE) name = models.CharField(max_length=50)
class MultiTableInheritanceB2(MultiTableInheritanceB1): parent = TreeForeignKey( 'self', null=True, blank=True, related_name='children', on_delete=models.CASCADE)
class ReferencingModel(models.Model): fk = TreeForeignKey(Category, related_name='+', on_delete=models.CASCADE) one = TreeOneToOneField(Category, related_name='+', on_delete=models.CASCADE) m2m = TreeManyToManyField(Category, related_name='+')
class Tree(MPTTModel): parent = TreeForeignKey( 'self', null=True, blank=True, related_name='children', on_delete=models.CASCADE)
parent = TreeForeignKey( 'self', null=True, blank=True, related_name='children', on_delete=models.CASCADE) now = models.DateTimeField(auto_now_add=True) class MPTTMeta: order_insertion_by = ('now',) # test registering of remote model class Group(models.Model): name = models.CharField(max_length=100) TreeForeignKey( Group, blank=True, null=True, on_delete=models.CASCADE ).contribute_to_class(Group, 'parent') mptt.register(Group, order_insertion_by=('name',)) class Book(MPTTModel): parent = TreeForeignKey( 'self', null=True, blank=True, related_name='children', on_delete=models.CASCADE) name = models.CharField(max_length=50) fk = TreeForeignKey( Category, null=True, blank=True, related_name='books_fk', on_delete=models.CASCADE) m2m = TreeManyToManyField(Category, blank=True, related_name='books_m2m')
class UniqueTogetherModel(MPTTModel): class Meta: unique_together = (('parent','code',),) parent = TreeForeignKey('self', null=True, on_delete=models.CASCADE) code = models.CharField(max_length=10)
class Article(models.Model): name = models.CharField(max_length=50) category = TreeForeignKey(Rubric, on_delete=models.PROTECT) def __str__(self): return self.name
from django.contrib.comments.models import Comment from django.db import models import mptt from mptt.fields import TreeForeignKey from managers import TreeCommentManager __all__ = ['Comment'] treefk = TreeForeignKey(Comment, blank=True, null=True, related_name='children') treefk.contribute_to_class(Comment, 'parent') title = models.CharField(blank=True, null=True, max_length=255) title.contribute_to_class(Comment, 'title') Comment.objects = TreeCommentManager() Comment.objects.model = Comment mptt.register(Comment)