Django drf about many-to-many RelatedField пользовательское поле

Я использую последнюю версию фреймворка The Django REST Framework, и таблица в модели связана по принципу "многие ко многим". и таблица в модели связана по принципу "многие ко многим"

Мой текущий код модели выглядит следующим образом:

model.py

class LvsDeploy(models.Model):
    MASTER = 'MASTER'
    BACKUP = 'BACKUP'
    ROLE_CHOICES = (
       (MASTER, 'MASTER'),
       (BACKUP, 'BACKUP')
    )
    id = models.AutoField(primary_key=True)
    cluster_name = models.CharField(max_length=30)
    dip = models.CharField(max_length=15, verbose_name='DR IP')
    role = models.CharField(max_length=10, choices=ROLE_CHOICES, verbose_name="role")



class LoadBalance(models.Model):
    id = models.AutoField(primary_key=True)
    lb_name = models.CharField(max_length=30, verbose_name='load balance')
    cluster = models.ManyToManyField('LvsDeploy',related_name='cluster')
    vip = models.CharField(max_length=50, verbose_name='VIP')
    port = models.IntegerField(verbose_name='port')

    def __str__(self):
        return self.lb_name

Мой код сериализатора выглядит следующим образом:

serializers.py

class LvsDeployReadOnly(serializers.ModelSerializer):
    class Meta:
        model = LvsDeploy
        fields = '__all__'

class LoadBalanceSerializer(serializers.ModelSerializer):
    cluster_name = serializers.RelatedField(source='cluster.name',read_only=True)
    cluster = LvsDeployReadOnly(many=True)
    ##rs = RSInfoSerializer(many=True, read_only=True)
    class Meta:
        model = LoadBalance
        fields = '__all__'
        ##extra_fields = ['rs','cluster','cluster_name']
        extra_fields = ['rs','cluster','cluster_name']

Мой код представления:

class BalanceList(views.APIView):
    def get(self, request):
        queryset = LoadBalance.objects.all()
        serializer = LoadBalanceSerializer(queryset, many=True)
        print(serializer.data)
        return Response(serializer.data)

и запросить фактический выход:

[
    {
        "id": 2,
        "cluster_name": null,
        "cluster": [
            {
               "id": 1,
               "cluster_name": "lvs_sz01",
               "dip": "1.1.1.6",
               "role": "BACKUP",

            },
            {
               "id": 2,
                "cluster_name": "lvs_sz01",
                "dip": "1.1.1.5",
                "role": "BACKUP",

            }
    ],
        "lb_name": "lb001",
        "vip": "1.1.1.1",
        "port": 80,
    }
]

Но в словаре списков поданное значение cluster_name одинаково. Я хочу, чтобы вывод выглядел следующим образом:

[
    {
        "id": 2,
        "cluster_name": "lvs_sz01",
        "cluster": [
            {
               "dip": "1.1.1.6",
               "role": "BACKUP",

            },
            {
                "dip": "1.1.1.5",
                "role": "BACKUP",

            }
        ],
        "lb_name": "lb001",
        "vip": "1.1.1.1",
        "port": 80,
    }
]

Как мне его изменить? Вы можете мне помочь?

Я сам решил эту проблему с помощью следующего метода:

class LoadBalanceSerializer(serializers.ModelSerializer):

    cluster_name = serializers.SerializerMethodField()
    cluster = LvsDeployReadOnly(many=True, read_only=True)
    rs = RSInfoSerializer(many=True, read_only=True)

    class Meta:
        model = LoadBalance
        fields = '__all__'
        extra_fields = ['rs','cluster','cluster_name']

    def get_cluster_name(self,obj):
        print(type(obj.lb_name))
        lvs_cluster = obj.cluster.all()
        cluster_name  = [ i.cluster_name for i in lvs_cluster ][0]
        print(cluster_name)
        return cluster_name

Спасибо!

Вернуться на верх