Как я могу преобразовать экземпляр в дикт с помощью метода модели и отношений?

Как я могу преобразовать экземпляр в dict с помощью метода модели и отношений?

class Customer(models.Model): 
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50,,null=True,blank=True)
    birthdate = models.DateField(max_length=100,null=True,blank=True)
    status = models.ForeignKey('status ',on_delete=models.CASCADE)
    something = models.ManyToManyField('Something',blank=True)


    def get_age(self):
        diff = relativedelta(datetime.date.today(),self.birthdate )
        return diff

я хочу собраться ниже

{
  uuid : "value",
  name : "value",
  birthdate = "value",
  status = {
      status_id : "value"
      status_text : "value"
  },
  something : [{
       something_id : "value",
       something_value : "value"
  },{
       something_id : "value",
       something_value : "value"
  }],
get_age : "value"
}

спасибо каждому эксперту

Короткий ответ

Вам следует использовать сериализаторы, в вашем случае лучшим вариантом будет ModelSerializer.

Длинный ответ

Во-первых, необходимо добавить декоратор @property к функции get_age (я переименовал ее в age):

@property
def age(self):
    diff = relativedelta(datetime.date.today(),self.birthdate )
    return diff

Затем создайте сериализаторы:

class StatusSerializer(serializers.ModelSerializer):
    class Meta:
        model = Status
        fields = ['status_id', 'status_value']

class SomethingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Something
        fields = ['something_id', 'something_value']

class CustomerSerializer(serializers.ModelSerializer):
    status = StatusSerializer()
    something = SomethingSerializer(many=True)
    class Meta:
        model = Customer
        fields = ['uuid', 'name', 'birthdate', 'status', 'something', 'age']

Затем вы используете сериализатор для преобразования экземпляра вашей модели в dict:

customer_dict = CustomerSerializer(customer_model).data
Вернуться на верх