Свойство экземпляра self в Django Models?
Недавно я создал модель для хранения некоторых состояний в моей БД. Это очень просто, я храню только id и имя.
class PayType(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
class Meta:
ordering = ('-name',)
def __str__(self):
return "[{0}] {1}".format(self.id, self.name)
Здесь вы можете увидеть миграцию, где я вставляю значения по умолчанию в БД.
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('stockmanager', '0023_pagotipo_remove_carrito_unidades_totales_and_more'),
]
def insertPayType(apps, schema_editor):
PayType = apps.get_model('stockmanager', 'PayType')
PayType(name="Credit").save()
PayType(name="Debit").save()
PayType(name="Cash").save()
operations = [
migrations.RunPython(insertPayType)
]
Как вы можете видеть, у меня будут фиксированные строки в БД. Я хотел бы добавить properties в модель PayType, чтобы иметь легкий доступ к экземплярам модели. Подобно статическому атрибуту в java.
class PayType(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200)
class Meta:
ordering = ('-name',)
def __str__(self):
return "[{0}] {1}".format(self.id, self.name)
# I'm looking for something like this
@property
def CREDIT(self):
return self.objects.get(self, id = 1)
# I also tried with this, same result :(
@property
def DEBIT(self):
return get_object_or_404(self, id = 2)
Я пытался получить доступ в другой части моего кода с помощью этого
class Pay(models.Model):
id = models.AutoField(primary_key=True)
order_id = models.IntegerField()
value = models.FloatField()
pay_type = models.ForeignKey(PayType, on_delete=models.CASCADE)
Pay(
order_id = order_id,
value = 100,
# I want this
pay_type = Pay.CASH #Error line
).save()
Дело в том, что я получаю эту ошибку
Cannot assign "<property object at 0x00000138FEAC7F60>": "Pay.pay_type" must be a "PayType" instance.
Есть идеи?
Разве вы не можете просто написать свою логику таким образом? Это должно работать так:
# I'm looking for something like this
@property
def CREDIT(self):
return PayType.objects.get(id = 1)
# I also tried with this, same result :(
@property
def DEBIT(self):
return get_object_or_404(PayType, id = 2)
Вы также можете попытаться получить класс PayType
с помощью meta framework или попытаться поймать его с помощью type(self)
, я думаю, это должно сработать.