DRF序列化程序不在默认HTML表单页面API中显示字段(外键和many2many)。字段在GET

时间:2020-02-25 23:51:27

标签: python-3.x django-models django-rest-framework django-templates django-serializer

DRF序列化器包含一个组和清单字段,它们是多对多和外键。默认DRF HTML表单中缺少它,但在GET视图中可用。当前,深度字段在序列化器中启用。如果我要删除深度,则外键可以使用默认的HTML格式,但仍缺少groupman2many组。我需要POST呼叫或DRF HTML表单中的两个字段。

我是否必须编写一些创建方法,但是我不想为外键创建新记录,并且many2many只想利用现有字段。

我的序列化器类。

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 :(得分:0)

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)

答案 1 :(得分:0)

这是示例JSON

.lock().unwrap().pop()