python - relations - Defina una orden para ManyToManyField con django
one to many django (3)
Este es un ejemplo que tengo, un sitio que organiza a las personas en departamentos con pedidos por departamento. Es el mismo concepto que tu problema pero con diferentes modelos. Este ejemplo usa muchos a muchos a través de la tabla.
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
Y el modelo a través:
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)
Y el administrador:
class DepartmentPeopleInline(admin.TabularInline):
model = DepartmentPeople
extra = 1
class DepartmentAdmin(admin.ModelAdmin):
inlines = (DepartmentPeopleInline,)
admin.site.register(Person, PersonAdmin)
admin.site.register(Department, DepartmentAdmin)
SOLICITUD DE COMENTARIO:
Nota: el siguiente es mi PersonAdmin, pero es innecesariamente complicado para este ejemplo. usted podría salir con un simple
class PersonAdmin(admin.ModelAdmin) :
pass
PERO esto es lo que estoy usando en mi aplicación:
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)
¿Hay una manera de definir el orden de los elementos de la lista de contenidos?
ejemplo
ArticleContainer1 contiene en este orden:
Artículo1, artículo2, artículo3, artículo6ArticleContainer2 contiene en este orden:
Artículo3, artículo2, artículo1, artículo4ArticleContainer3 contiene en este orden:
articulo5
Aquí están mis clases:
class Article(models.Model):
title = models.CharField(max_length=200)
class ArticleContainer(models.Model):
contents = models.ManyToManyField(Article, blank=True, null=True)
Si usa una relación explícitamente definida a through
modelo para m2m, puede agregar su propio atributo order-id
. Luego, puede extender ManyToManyField para completar el ID de pedido según su lógica en crear / actualizar y un administrador de m2m modelo que ordenará los resultados cuando los obtenga por el atributo de ID de pedido.
Ver los documentos a through .