Django - Получение связанных объектов

Существуют такие модели:

class Nomenclature(models.Model):
    nameNom = models.CharField(max_length=150,verbose_name = "Название номеклатуры")
    numNom = models.CharField(max_length=50,verbose_name = "Номер номеклатуры",unique=True)
    quantity = models.IntegerField(verbose_name="Количество", default=0)
    numPolk = models.CharField(max_length=150,verbose_name = "Номер полки/места"  

class Changes(models.Model):
    numNomenclature = models.ForeignKey(Nomenclature, on_delete=models.CASCADE,related_name="chamges",verbose_name="Номер номеклатуры")
    quantity = models.IntegerField(verbose_name="Количество",null=True)
    location = models.CharField(max_length=50,verbose_name = "Место установки")
    fullname = models.CharField(max_length=150,verbose_name = "ФИО")
    appointment = models.CharField(max_length=50,verbose_name = "Назначение")
    created_at = models.DateTimeField(auto_now_add=True,verbose_name='Дата/время', null=True)

Необходимо вывести название и номер номенклатуры и все связанные с ней изменения в шаблоне, а также вывести все поля

Я обнаружил, что select_related существует, но мне показалось, что он работает не так, как мне нужно.

Я не совсем уверен, что это то, что вам нужно.
Если вам нужно получить все изменения из одной модели "Номенклатура":

md = Nomenclature.objects.get(id=id) # Not sure how you fetch this, just an example.
all_changes_for_md = Changes.objects.filter(numNomenclature__id=md.id)

Это позволит получить все изменения для модели номенклатуры.
Также это можно сделать следующим образом:

md = Nomenclature.objects.get(id=id) # Not sure how you fetch this, just an example.
all_changes_for_md = md.chamges.all() # You made a typo in the related name.

Select related имеет другое назначение, он используется для предварительной выборки.
Из документации Django:

select_related(*fields)
. Возвращает QuerySet, который будет "следовать" за отношениями с иностранными ключами, выбирая дополнительные данные связанных объектов при выполнении запроса. Это повышает производительность, что приводит к одному более сложному запросу , но означает, что последующее использование отношений "иностранный ключ" не потребует запросов к базе данных.

https://docs.djangoproject.com/en/4.1/ref/models/querysets/#select-related

Вернуться на верх