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>]