DRF Serializer не отображает поля (внешний ключ и многие другие) по умолчанию HTML API страницы формы. Поле доступно в GET - PullRequest
1 голос
/ 26 февраля 2020

DRF Serializer содержит поле группы и инвентаря, в котором находятся многие2many и внешний ключ. Он отсутствует в стандартной форме DRF HTML, но доступен в представлении GET. в настоящее время поле глубины включено в Serializer. Если я удаляю глубину, тогда Внешний ключ доступен в форме HTML по умолчанию, но поле group2many все еще отсутствует. Мне нужны оба поля для вызова POST или в форме DRF HTML.

Нужно ли мне писать какой-то метод create, но я не хочу создавать новую запись для внешнего ключа, а many2many просто хочет использовать существующее поле.

Класс My Serializer.

class MainHostSerializer(serializers.ModelSerializer):
    class Meta:
        model = MainHost
        fields = (
            'host_id', 
            'host_name',
            'inventory',
            'group'
        )  
        # depth = 2 

Необработанное представление по умолчанию DRF HTML Форма

{
    "host_id": null,
    "host_name": ""
}

Класс модели

class MainHost(models.Model):
    host_id =  models.IntegerField(verbose_name='HOST ID', primary_key=True)
    host_name =  models.CharField(verbose_name='HOST NAME', max_length=512)
    inventory = models.ForeignKey(related_name='inv_ins', on_delete=models.SET_NULL, to='hosts.MainInventory', blank=True, null=True)
    group = models.ManyToManyField(MainGroup, related_name='hostgroups', through ='HostGroup')

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Это был образец JSON

{
    "count": 1692,
    "next": "http://127.0.0.1:8000/api/mainhost/?page=2",
    "previous": null,
    "results": [
        {
            "host_id": 4087,
            "host_name": "10.240.144.2",
            "inventory": {
                "inv_id": 91,
                "inv_name": "GNS Switches (TestNet)",
                "total_hosts": 539,
                "total_groups": 1,
                "org_name": "ABC_TestNet",
                "description": "Inventory of ABC switches on Testnet",
                "inv_variables": "environ: testnet"
            },
            "group": [
                {
                    "group_id": 280,
                    "group_name": "aruba",
                    "total_hosts": 539,
                    "total_groups": 0,
                    "inv_id": {
                        "inv_id": 91,
                        "inv_name": "ABC Switches (TestNet)",
                        "total_hosts": 539,
                        "total_groups": 1,
                        "org_name": "ABC_TestNet",
                        "description": "Inventory of ABC switches on Testnet",
                        "inv_variables": "environ: testnet"
                    },
                    "description": "imported",
                    "group_variables": "{}",
                    "groupinv_name": "ABC Switches (TestNet)",
                    "groupinv_description": "",
                    "groupinv_source": "scm",
                    "groupinv_path": "TEC/GNS/Switches/testnet.ini"
                }
            ],
            "description": "imported",
            "foreman_group": "[{'id': 280, 'name': 'aruba'}]",
            "host_variables": "{}",
            "ansible_facts": "{}"
        }
    ]
}
0 голосов
/ 03 марта 2020

Метод создания для сериализатора MainHost

def create(self, validated_data):
    inv_data = validated_data.pop('inventory')
    inv_res = MainInventory.objects.create(**inv_data)

    group_data = validated_data.pop('group')
    host_data = MainHost.objects.create(inventory = inv_res, **validated_data)

    for g_data in group_data:
        inv_data = g_data.pop('inv_id')
        inv = MainInventory.objects.create(**inv_data)
        group_res = MainGroup.objects.create(inv_id = inv, **g_data)
        print(validated_data)
        HostGroup.objects.create(host = host_data, group =  group_res)
...