DRF-如何在序列化器中做很多只读和只写字段

DRF- how to do many readonly and writeonly fields in serializers

我在模型中使用了两个外键。我想在我们给出 get 请求时显示这些字段的名称,我已经尝试过,但它只工作一个字段而不是其余的一个。 models.py

class Organization(models.Model):
    code = models.CharField(max_length=25, null=False, unique=True)
    name = models.CharField(max_length=100, null=False)
    location = models.ForeignKey(Location, on_delete=models.RESTRICT)
    mol_number = models.CharField(max_length=100)
    corporate_id = models.CharField(max_length=100)
    corporate_name = models.CharField(max_length=100)
    routing_code = models.CharField(max_length=100)
    iban = models.CharField(max_length=100)
    description = models.TextField()
    total_of_visas = models.IntegerField(null=False, default=0)
    base_currency = models.ForeignKey(Currency, on_delete=models.RESTRICT)

    def __str__(self):
        return self.name

serializers.py

class OrganizationSerializer(serializers.ModelSerializer):
    location = serializers.CharField(read_only=True, source="location.name")
    base_currency = serializers.CharField(read_only=True, source="base_currency.currency")
    location_id = serializers.IntegerField(write_only=True, source="country.id")
    base_currency_id = serializers.IntegerField(write_only=True, source="base_currency.id")

    class Meta:
        model = Organization
        fields = ["id", "name", "location", "mol_number", "corporate_id", "corporate_name",
                  "routing_code", "iban", "description", "total_of_visas", "base_currency",
                  "location_id", "base_currency_id"]

    def create(self, validated_data):
         ...

    def update(self, instance, validated_data):
        ...

如何访问这两个字段???.. Anyhelp Appreciable..

您可以覆盖 to_representation 方法

def to_representation(self, instance):
     ....

所以像这样:

class OrganizationSerializer(serializers.ModelSerializer):
       ...
class Meta:
       ...
def to_representation(self, instance):
    rep = super(OrganizationSerializer, self).to_representation(instance)
    rep['location'] = instance.location.name //the .name is the field in the //location model that you want to return it can be anything in the model
    rep['base_currency'] = instance.base_currency.currency
    rep['location_id'] = instance.location_id.country.id
    rep['base_currency_id'] = instance.base_currency_id.base_currency_id
    return rep

def create(self, validated_data):
     ...

def update(self, instance, validated_data):