through one manytomany many foreign example decimalfield python django many-to-many order

python - one - Django ManyToManyField pedidos utilizando a través?



manytomany django (7)

Aquí hay un fragmento de cómo están configurados mis modelos:

class Profile(models.Model): name = models.CharField(max_length=32) accout = models.ManyToManyField( ''project.Account'', through=''project.ProfileAccount'' ) def __unicode__(self) return self.name class Accounts(models.Model): name = models.CharField(max_length=32) type = models.CharField(max_length=32) class Meta: ordering = (''name'',) def __unicode__(self) return self.name class ProfileAccounts(models.Model): profile = models.ForeignKey(''project.Profile'') account = models.ForeignKey(''project.Accounts'') number = models.PositiveIntegerField() class Meta: ordering = (''number'',)

Luego, cuando accedo a las Cuentas, ¿cómo puedo ordenar por ''número'' en el modelo intermedio de Cuentas de perfil, en lugar del ''nombre'' predeterminado en el modelo de Cuentas ?:

for acct_number in self.profile.accounts.all(): pass

Esto no funciona, pero es la esencia de cómo quiero que acceda a estos datos:

for scanline_field in self.scanline_profile.fields.all().order_by(''number''): pass


Acabo de pasar por esto.

class Profile(models.Model): accounts = models.ManyToManyField(''project.Account'', through=''project.ProfileAccount'') def get_accounts(self): return self.accounts.order_by(''link_to_profile'') class Account(models.Model): name = models.CharField(max_length=32) class ProfileAccount(models.Model): profile = models.ForeignKey(''project.Profile'') account = models.ForeignKey(''project.Account'', related_name=''link_to_profile'') number = models.PositiveIntegerField() class Meta: ordering = (''number'',)

Quité los campos que estaban fuera de tema excepto en Article.name . Esa es la solución más corta que he encontrado, ni idea de si era posible usarla en 2010, pero ciertamente lo es ahora.


Agregue el nombre relacionado a ProfileAccounts y luego cambie el orden en las Cuentas con ese ''nombre_conectado__número''. Tenga en cuenta dos guiones bajos entre related_name y número. Vea abajo:

class Accounts(models.Model): . . . class Meta: ordering = (''profile_accounts__number'',) class ProfileAccounts(models.Model): . . . account = models.ForeignKey(''project.Accounts'', related_name=''profile_accounts'') number = models.PositiveIntegerField() class Meta: ordering = (''number'',)


Eso funcionó para mí:

Profile.objects.account.order_by(''profileaccounts'')


Hay un error tipográfico en el Perfil (es "accout" cuando creo que te refieres a "cuenta"), pero lo más importante es que tienes tus formas singular / plural mezcladas en el modelo.

En Django, la práctica generalmente es nombrar a sus clases en singular, y sus nombres ManyToManyField en plural. Asi que:

class Profile(models.Model): name = models.CharField(max_length=32) accounts = models.ManyToManyField( ''Account'', through=''ProfileAccount'' ) def __unicode__(self) return self.name class Account(models.Model): name = models.CharField(max_length=32) type = models.CharField(max_length=32) class Meta: ordering = (''name'',) def __unicode__(self) return self.name class ProfileAccount(models.Model): profile = models.ForeignKey(Profile) account = models.ForeignKey(Account) number = models.PositiveIntegerField() class Meta: ordering = (''number'',)

Estoy un poco confundido con lo que está tratando de hacer con este modelo, pero si realiza esos cambios, entonces for acct_number in self.profile.accounts.all().order_by(''number''): debería funcionar. Suponiendo que no hay otros problemas.


La solución más fácil para este problema en particular parece ser

for acct in self.profile.accounts.order_by(''profileaccounts''): pass


Tengo esto en varios de mis modelos, pero en mi opinión (y, a diferencia de todas las demás respuestas), no debería tener que especificar el order_by nuevamente porque, bueno, ya está especificado en el modelo order_by . Especificarlo de nuevo rompe el principio DRY (no te repitas).

Yo usaría:

qs = profile.profileaccounts_set.all()

Esto proporciona el conjunto de Cuentas de perfil asociadas a un perfil utilizando su orden configurado. Entonces:

for pa in qs: print(pa.account.name)

Para obtener puntos de bonificación, también puede acelerar el proceso general utilizando select_related en la consulta.


un administrador ManyToManyField le permite seleccionar / filtrar datos del modelo relacionado directamente, sin usar ninguna conexión de modelo del modelo a través de su nivel de django ...

Igualmente,

si intentas:

pr = Profile.objects.get(pk=1) pr.account.all()

Le devuelve todas las cuentas relacionadas con ese perfil. Como ve, no existe una relación directa con el modelo pasante ProfileAccount, por lo que no puede usar la relación M2M en este punto ... Debe usar una relación inversa al modelo pasante y filtrar los resultados ...

pr = Profile.objects.get(pk=1) pr.profileaccount_set.order_by(''number'')

le dará un queryset ordenado, pero, en este caso, lo que tiene en queryset son los objetos de cuenta de perfil, no los objetos de cuenta ... Entonces, tiene que usar otra relación de nivel de django para ir a cada cuenta relacionada con:

pr = Profile.objects.get(pk=1) for pacc in pr.profileaccount_set.order_by(''number''): pacc.account