使用Django为ManyToManyField定义订单

发布于 2021-01-29 17:06:00

有没有一种方法可以定义通过ManyToManyField相关的对象的顺序?

例:

  • ArticleContainer1按此顺序包含:article1,article2,article3,article6

  • ArticleContainer2依次包含:article3,article2,article1,article4

  • ArticleContainer3按此顺序包含:
    article5

这是我的课程:

class Article(models.Model):    
    title = models.CharField(max_length=200)

class ArticleContainer(models.Model):
   contents = models.ManyToManyField(Article, blank=True, null=True)
关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    因此,这是我的一个示例,该站点按部门排序将人员组织到部门中。与问题的概念相同,但模型不同。本示例使用多对多表。

    class Department(models.Model):
        slug = models.SlugField(
            verbose_name    = _(u'Slug'),
            help_text           = _(u'Uri identifier for this department.'),
            max_length=255
        )
        name = models.CharField(
            verbose_name    = _(u'Department Name'),
            help_text           = _(u'The department\'s name.'),
            max_length      = 255
        )
        description = models.TextField(
            verbose_name    = _(u'Description'),
            help_text           = _(u'Department\'s description')
        )
        people = models.ManyToManyField(
            Person,
            through             = 'DepartmentPeople',
            related_name    = 'people',
            verbose_name    = _(u'People'),
            help_text           = _(u'People in this Department')
        )
        order_by = models.IntegerField(
            verbose_name    = _(u'Ordering Weight'), 
            help_text           = _(u'This item\'s weight within a list.'),
            max_length      = 255
        )
    
        class Meta:
            verbose_name = _(u"Department")
            verbose_name_plural = _(u"Departments")
            ordering = ['order_by',]
    
        def people_list(self):
            return [dp.person for dp in DepartmentPeople.objects.filter(department=self).order_by('order')]
    
        def __unicode__(self):
            return self.name
    

    通过模型:

    class DepartmentPeople(models.Model):
        person = models.ForeignKey(
            Person,
            verbose_name    = _(u'Person'),
            help_text           = _(u'Person is a member of this deparment.'),
        )
        department = models.ForeignKey(
            Department,
            verbose_name    = _(u'Department'),
            help_text           = _(u'Pseron is a member of this department.'),
        )       
        order = models.IntegerField(
            verbose_name    = _(u'Order'),
            help_text           = _(u'What order to display this person within the department.'),
            max_length      = 255
        )
    
        class Meta:
            verbose_name = _(u"Department Person")
            verbose_name_plural = _(u"Department People")
            ordering = ['order',]
    
        def __unicode__(self):
            return self.person.first_name + " " + self.person.last_name + " is a member of " + self.department.name + (" in position %d" % self.order)
    

    和管理员:

    class DepartmentPeopleInline(admin.TabularInline):
        model = DepartmentPeople
        extra = 1
    
    class DepartmentAdmin(admin.ModelAdmin):
        inlines = (DepartmentPeopleInline,)
    
    admin.site.register(Person, PersonAdmin)
    admin.site.register(Department, DepartmentAdmin)
    

    征求意见:

    注意:以下是我的PersonAdmin,但在此示例中其不必要地复杂。你可以通过一个简单的

    class PersonAdmin(admin.ModelAdmin) :
        pass
    

    但是,这就是我在我的应用程序中使用的:

    class PersonForm(forms.ModelForm):
        abstract = forms.CharField(
            widget=TinyMCE(attrs={'cols': 80, 'rows': 30})
        )
    
        class Meta:
            model = Person
    
    class PersonAdmin(reversion.VersionAdmin):
        form = PersonForm
        # The Form Fieldsets
        fieldsets = [
            (
                None,
                {
                    'fields'    : [('first_name', 'last_name', 'post_nominal', ), 'slug', 'title', 'headshot', 'large_photo', ('email', 'phone', ), 'abstract']
                },
            )
        ]
    
        # Prepopulated fields
        prepopulated_fields = {'slug': ('first_name', 'last_name', 'post_nominal', )}
    
        # Fields that are readonly
        #readonly_fields = ('slug', )
    
        def formfield_for_dbfield(self, db_field, **kwargs):
            if db_field.name == 'headshot':
                request = kwargs.pop("request", None)
                kwargs['widget'] = AdminImageWidget
                return db_field.formfield(**kwargs)
            return super(PersonAdmin, self).formfield_for_dbfield(db_field, **kwargs)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看