본문 바로가기

나의 IT

Django Model Tips

1. Django Model Property and setter

class HomeModel(models.Model):
    _is_test = models.CharField(max_length=1, default='Y')
    coffee_price = models.FloatField(default=0.00)
    tea_price = models.FloatField(default=0.00)

    @property
    def is_test(self):
        return True if self._is_test == 'Y' else False

    @is_test.setter
    def is_test(self, value):
        self._is_test = 'Y' if value else 'N'

    @property
    def total_price(self):
        return self.coffee_price + self.tea_price

예1)

만약 'Y'/'N'을 가지는 필드가 있을때 bool 값으로 변환


예2)

coffee 가격과 tea 가격을 합한 total 가격을 기본으로 설정

>>> from home.models import HomeModel
>>> home = HomeModel(coffee_price=3.33, tea_price=2.22)
>>> home.total_price
5.550000000000001
>>> home._is_test
'Y'
>>> home.is_test = False
>>> home._is_test
'N'


2. PK가 다른 field 로 1:N 관계 설정

class ClassRoomModel(models.Model): id = models.AutoField(primary_key=True) class_role = models.CharField(max_length=40) student_id = models.ForeignKey('StudentModel', to_field='student_id',                                                                                   related_name='student_roles')

class StudentModel(models.Model): id = models.AutoField(primary_key=True) student_id = models.CharField(max_length=40, unique=True) def save(self, *args, **kwargs): if not self.pk: self.student_id = 'STID%s' % (self.id,) super(StudentModel, self).save(*args, **kwargs)

예1)

기본적으로 ForeignKey 필드는 pk로 연결됩니다. to_field 를 이용하면 pk가 아닌 특정 필드값으로 1:N을 설정할 수 있습니다.


예2)

새로운 데이터를 입력할때 특정 필드값을 pk의 유무로 체크해서 값을 기본으로 설정할 수 있습니다.

예를들어 마지막 pk 값에 특정 문자열을 더해서 unique 한 데이터를 생성

>>> StudentModel.objects.create()
<StudentModel: StudentModel object>
>>> StudentModel.objects.last().__dict__
{'student_id': 'STID_6', 'id': 6, '_state': <django.db.models.base.ModelState object at 0x7f71ee2a9320>}


예3)

reverse query로 값을 가져올 수 있습니다.

예를들어 student 모델에서 fk로 연결되어있는 class room model을 가져옴

>>> StudentModel.objects.last().student_roles.all()
[<ClassRoomModel: ClassRoomModel object>, <ClassRoomModel: ClassRoomModel object>, <ClassRoomModel: ClassRoomModel object>, <ClassRoomModel: ClassRoomModel object>]