Django - доступ к данным в модели из модели с внешним ключом
Для простоты я сократил код до отображения двух моделей. Я совсем новичок в Django и уже второй раз следую учебнику, но создаю свои собственные модели.
class Products(models.Model):
product_name = models.CharField(max_length=50,unique=True,null=False)
def __str__(self):
return self.product_name
class Current_tests(models.Model):
product = models.ForeignKey(Products, on_delete=models.CASCADE)
no_samples = models.IntegerField(default=0)
stagecode=models.CharField(max_length=30,default="UPDATE REQUIRED")
def __str__(self):
return self.stagecode
Я немного запутался в том, как получить доступ к данным в моей модели Products, используя внешний ключ в Current tests. Например, мне может понадобиться название_продукта, связанное с определенным идентификатором строки данных Current_test, или посмотреть название_продукта на основе значения кода этапа.
Равным образом, как мне получить все stagecode для заданного названия продукта.
В учебнике это делается так:
q = Question.objects.get(pk=1)
# Display any choices from the related object set -- none so far.
>>> q.choice_set.all()
<QuerySet []>
https://docs.djangoproject.com/en/5.1/intro/tutorial02/
Когда я меняю классы местами, я получаю «AttributeError: „Current_tests“ object has no attribute „product_name_set“.
Я просмотрел много вопросов здесь, которые предлагают использовать «связанное имя», «фильтр», но я не смог получить доступ к данным.
Спасибо
Фильтр по иностранному объекту, требуется '__'. Использование '_' не находит иностранный объект.
# call foreign object
a = Current_tests.object.get({some code})
b = a.poduct
# filter by foreign object
a = Current_tests.object.get(product__name='{some name}')
b = a.poduct
используя ваши модели и немного расширяя то, что уже сказал django.seolpyo.com:
x = Current_tests.objects.get(pk = <nn>) #this gets a specific record
print (x.product.product_name) #this prints the product_name associated with the product record you retrieved above.
Обратите внимание, что в приведенном выше примере вы можете вернуть только 1 запись. если вы попытаетесь выполнить .get() для любого другого поля в модели current_tests, вы, возможно, получите ошибку, поскольку она вернет несколько строк (например, в этой модели нет уникальных строк без pk)
Если вы получаете несколько записей current_tests (вы должны использовать .filter(), а не .get())
x = Current_tests.objects.filter(product__product_name = '<some product name from the product model>') #this will get all current_tests which have a product name denoted by <some value>
for rec in x:
print(f'prod name: {rec.product.product_name} | stage code: {rec.stagecode}')