参照[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 '배쓰 밤'

非常に混乱した逆参照と逆参照の場合を考える

  • Subcategoryには複数の製品があります.
  • 製品はSubcategoryを参照してください.
  • 製品は、所有者Subcategoryの情報(name)を参照しながら取得することができる.
  • Subcategoryのデータに基づいてSubCategoryが所有する製品を取得するには、
  • を使用します.
  • product idに基づいてフィルタリングすることができるが、ProductテーブルのQuery Setのみが得られる.
  • SubCategoryデータと製品データを同時に持つQuerySetの入手方法
  • 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': '에그 웨그'}]