Итерация по django m2m через объекты модели

#python #django #django-models

#python #django #django-модели

Вопрос:

В моем проекте у меня есть следующие отношения ManyToMany:

 class Borrador(models.Model):

    nombre = models.CharField(
        max_length=40,
        help_text=_('Nombre para identificar al borrador.')
    )
    productos = models.ManyToManyField(
        Producto,
        through=Articulo,
    )

class Articulo(models.Model):

    producto = models.ForeignKey(
        Producto,
        on_delete=models.SET_NULL,
        null=True
    )
    borrador = models.ForeignKey(
        'Borrador',
        on_delete=models.SET_NULL,
        null=True
    )
    unidades = models.IntegerField(
        default=1
    )

class Producto(models.Model):

    nombre_amistoso = models.CharField(
        max_length=40,
        help_text=_('Nombre corto para identificarlo facilmente.'),
        verbose_name=_('Pseudónimo')
    )
    nombre_fabricante = models.CharField(
        max_length=60,
        help_text=_(
            'Nombre largo que le da el fabricante al producto.'
        ),
        verbose_name=_('Nombre real')
    )
    fabricante = models.ForeignKey(
        'Fabricante',
        on_delete=models.SET_NULL,
        blank=True,
        null=True
    )
    # etc...
 

Как вы можете видеть, модель Articulo действует как сквозная промежуточная модель для получения дополнительной информации.
Я пытаюсь выполнить итерацию по всем объектам Articulo, связанным с данным объектом Borrador.
На данный момент я заставил его работать, делая это:

 class Borrador(models.Model):

    # [...]

    def tramitar(self, usuario, solicitar=False):

        articulos = self.productos.through.objects.filter(
            borrador=self
        )
        for articulo in articulos:
            # do stuff
 

Моя первая попытка была описана ниже, но она возвращает все объекты Articulo в базе данных

 articulos = self.productos.through.objects.all()
for articulo in articulos:
    # do stuff
 

Есть ли лучший способ сделать это? Я представлял себе простую self.productos.through работу shoul, но это не так…

Заранее спасибо! J.

Комментарии:

1. Не могли бы вы просто сделать Borrador.Articulo.all() ?

2. Не пробовал, но я думаю, что ответ Виллема в любом случае является правильным ответом. Хотя спасибо!

Ответ №1:

Вы можете получить доступ к Articulo s через related_name=… параметр [Django-doc] из ForeignKey :

 def tramitar(self, usuario, solicitar=False):
    articulos = self.articulo_set.all()
    # … 

Комментарии:

1. О черт, я был так сосредоточен на отношениях m2m, что забыл, что у меня есть ForeignKey, который я мог бы использовать (как я делал несколько раз в одном и том же проекте). Большое спасибо!