Foreignkeyのpkを返すpropertyについて

setattr(self, field.attname, val) AttributeError: can't set attribute」というメモで、django.db.models.Modelを継承したクラスにForeignKeyと、それと同じ名前_idという名前のプロパティを定義すると、インスタンス生成の際にエラーが発生することを書きました。しかし、その時に調べた内容をよく考えると、そもそもプロパティを定義する必要はないことに気づきました。

プロパティの内容は、ForeignKeyがあればそのPK、なければNoneを返すというものでした。しかし、そもそもForeignKeyを持つインスタンスから、ForeignKey名_idでアクセスすれば、同様の結果が返ってきます。

--- ファイル: test/models.py ---

from django.db import models

class Hoge(models.Model):
    name = models.CharField(max_length=64)


class Fuga(models.Model):
    name = models.CharField(max_length=64)
    hoge = models.ForeignKey('Hoge', null=True)

    '''
    @property
    def hoge_id(self):
        return self.hoge.id if self.hoge else None
    '''
$ python manage.py reset test
$ python manage.py shell
>>> from test.models import *
>>> hoge = Hoge(name='HOGE')
>>> hoge.save()
>>> fuga1 = Fuga(name='FUGA1', hoge=hoge)
>>> fuga1.save()
>>> fuga2 = Fuga(name='FUGA2')
>>> fuga2.save()
>>> fuga1.hoge_id
1
>>> fuga1.hoge_id.__class__
>>> <type 'int'>
>>> fuga2.hoge_id
>>> fuga2.hoge_id.__class__
>>> <type 'NoneType'>

この記事が役に立った場合、シェアしていただけると励みになります!!