参照[Django]Query Setの定義、逆参照
プロジェクトで混同された正参照、逆参照整理🗒
ブログのパージに使用されるデータベースのステータス
Project Models.py
class Product(models.Model):
name = models.CharField(max_length=50)
price = models.DecimalField(max_digits=10, decimal_places=2)
sub_category = models.ForeignKey('SubCategory', on_delete=models.CASCADE)
label = models.ManyToManyField('Label', through='ProductLabel')
class Category(models.Model):
name = models.CharField(max_length=50)
category = models.ForeignKey('Menu', on_delete=models.CASCADE)
class SubCategory(models.Model):
name = models.CharField(max_length=50)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
QuerySet正参照&逆参照
正の参照
参照したテーブルへのアクセス
オブジェクトに別のオブジェクトのForeignKeyがある場合、または関係が1:1の場合に参照されます.>> a = Product.objects.get(id=1)
>> b = a.sub_category.name
>> print(b)
>> # output '배쓰 밤'
select_related()
なしでrelation
のオブジェクト情報を表示できます.
では、なぜselect_related()
を使うのでしょうか.
データベースにクエリーを要求する回数を減らすことで、パフォーマンスが向上します.
一度Hitでリレーショナルデータを取得するように.
select_related
>> a = Product.objects.select_related('sub_category').get(id=1)
>> a.sub_category.name
>> # output '배쓰 밤'
逆参照
参照先のテーブルへのアクセス
別のオブジェクトにForeignKeyまたはN:N関係がある場合は、そのオブジェクトを参照する他のオブジェクトを参照します.>> a = Category.objects.get(id=1)
>> b = a.subcategory_set.all()[0].name
>> # output '배쓰 밤'
非常に混乱した逆参照と逆参照の場合を考える
>> a = Product.objects.get(id=1)
>> b = a.sub_category.name
>> print(b)
>> # output '배쓰 밤'
>> a = Product.objects.select_related('sub_category').get(id=1)
>> a.sub_category.name
>> # output '배쓰 밤'
>> a = Category.objects.get(id=1)
>> b = a.subcategory_set.all()[0].name
>> # output '배쓰 밤'
prefetch_related
>>> prefetch_category = SubCategory.objects.prefetch_related('product_set').get(name='배쓰 밤')
product_data = [ {'product_name' : product.name } for product in list(prefetch_product.product_set.all())]
>>> product_data
[{'product_name': '험프티 덤프티'}, {'product_name': '에그 웨그'}]
Reference
この問題について(参照[Django]Query Setの定義、逆参照), 我々は、より多くの情報をここで見つけました https://velog.io/@inah-_-/Django-relations-m2mテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol