Вы можете получить доступ к данным ManyToMany, данных внешнего поля в наборе запросов с нижним подчеркиванием в формате ниже.
columnname.referred.table__reference_column
class DigitalApplicationsAndPlatform(models.Model):
digital_area = models.ForeignKey(MasterDigitalProductsAreas, on_delete=models.CASCADE)
keywords = models.ManyToManyField("MasterKeyword", blank=True, related_name="digital_keyword")
Набор запросов:
m = models.DigitalApplicationsAndPlatform.objects.filter(id=1).values('digital_product', 'digital_area__digital_area', 'keywords__keyword')
Над набором запросовбудет иметь несколько значений digital_product, digital_area__digital_area, поскольку поле ключевых слов имеет отношение ManyToMany.
Результат:
<QuerySet [{'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10000ft Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10K Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': '_10,000ft Insights_'}, {'digital_product': '10,000ft Insights', 'digital_area__digital_area': 'Productivity & Collaboration', 'keywords__keyword': "_10K' Insights_"}]>
Приведенный выше запрос влияет на производительность.Django обращается к базе данных каждый раз, когда вы пытаетесь получить доступ к связанным данным модели.
m = models.DigitalApplicationsAndPlatform.objects.filter(id=1).select_related('digital_area').prefetch_related('keywords').values('digital_product', 'digital_area__digital_area', 'keywords__keyword')
Вы используете нижеприведенные подсказки, чтобы справиться с вышеуказанным набором запросов.
- select_related - для внешнего ключа и поля OneToOne.
- prefetch_related - для ManyToMany и обратного просмотра
Ниже официальный документ даст представление о доступе к связанным данным.
https://docs.djangoproject.com/en/2.2/topics/db/queries/#lookups-that-span-relationships