#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, который я мог бы использовать (как я делал несколько раз в одном и том же проекте). Большое спасибо!