自動化無しに生活無し

WEB開発関係を中心に備忘録をまとめています

【Django】OneToOneFieldでつながっているデータの取得方法【モデル名を小文字にした属性名で取得できる】

thumbnail

OneToOneFieldを使う機会は限定されているので、備忘録として。

タイトルから既に(?)な状態かも知れないが、まずは、下記モデルを見てもらいたい。

# 店舗データテーブル
class StoreData(models.Model):

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["store","date"], name="unique_store_date"),
        ]


    store   = models.ForeignKey(Store,verbose_name="店舗",on_delete=models.CASCADE)
    date    = models.DateField(verbose_name="記録年月", validators=[check_day])

    def get_sale(self):
        return Sale.objects.filter(store_data=self.id) 

#売上テーブル
class Sale(models.Model):

    pc          = models.IntegerField(verbose_name="PC"     , validators=[MinValueValidator(0)])
    phone       = models.IntegerField(verbose_name="スマホ" , validators=[MinValueValidator(0)])
    app         = models.IntegerField(verbose_name="アプリ" , validators=[MinValueValidator(0)])
    store_data  = models.OneToOneField(StoreData, verbose_name="データ", on_delete=models.CASCADE)

Saleモデルオブジェクトから見たら、StoreDataに紐付いているモデルオブジェクトを取り出すには、こうすれば良い。

sale        = Sale.objects.all().first()
sale.store_data

では、StoreDataのモデルオブジェクトから見て、Saleに紐付いているモデルオブジェクトを取り出すにはどうしたら良いか。答えはこうすれば良いのだ。

store_data  = StoreData.objects.all().first()
store_data.sale

そう、モデルオブジェクトを小文字にすれば良い。ちなみに、SaleAmountなどのキャメルケースになっている場合。コレも同様に

store_data.saleamount

とすることで、紐付いているモデルオブジェクトの取得ができる。

だから、下記のようにわざわざモデルメソッドを作る必要はない。

# 店舗データテーブル
class StoreData(models.Model):

    #対象店舗と年月で重複した記録を許さない場合、このようにUniqueConstraintを使う。
    class Meta:
        constraints = [
            models.UniqueConstraint(fields=["store","date"], name="unique_store_date"),
        ]

    store   = models.ForeignKey(Store,verbose_name="店舗",on_delete=models.CASCADE)
    date    = models.DateField(verbose_name="記録年月", validators=[check_day])

    def get_sale(self):
        return Sale.objects.filter(store_data=self.id)
スポンサーリンク