【问题标题】:Django- Cleaning data for a many-to-many field within ModelFormDjango-为 ModelForm 中的多对多字段清理数据
【发布时间】:2019-12-10 18:49:44
【问题描述】:

我正在构建一个 API,它需要在创建模型实例之前将输入数据清理到 modelform m2m 字段中。

数据会以一串名字的形式出现,我需要清理数据并手动添加链接m2m关系。

在干净的 Def.我是否只是将每个附加到字段本身?

下面是我工作的“干净”def:

def clean_sourcingbroker(self):
        broker = self.cleaned_data['broker']
        cleanlist = []
        names = []
        for name in broker.replace(', ', ',').split(' '): 
            name = name.split(',')
            last_name = name[0]
            first_name = name[1]
            names.append((last_name, first_name))
        for name in names:
            brokerobj = Broker.objects.get(lastname=name[0], firstname=name[1])
            cleanlist.append(brokerobj)
        return cleanlist

【问题讨论】:

  • 如果你正在构建一个 API,你应该真正研究 django-rest-framework 而不是使用表单。
  • @DanielRoseman 感谢您的评论-到目前为止,我使用 djangorest 获取特定数据-通过 DjangoRest 创建模型实例的正确术语是什么?是否可以像我在创建实例之前那样清理数据?

标签: python django django-models


【解决方案1】:
# If you want to change the value of a field, then you can use

def to_internal_value(self, data):
    validatedData = (super(SerializerClass, self).to_internal_value(data))
    broker = validatedData["broker"]
    cleanlist = []
    names = []
    for name in broker.replace(', ', ',').split(' '):
        name = name.split(',')
        last_name = name[0]
        first_name = name[1]
        names.append((last_name, first_name))
    for name in names:
        brokerobj = Broker.objects.get(lastname=name[0], firstname=name[1])
        cleanlist.append(brokerobj)

    validatedData["broker"] = cleanlist
    return validatedData


# If you want to validate the field, then you can use

def validate(self, data):
    if len(data['broker']) == 0:
        raise serializers.ValidationError("validation error for broker field")
    return data

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2021-08-21
    • 2021-11-22
    • 2021-08-13
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多