首页 > 解决方案 > 发布的数据不会出现在 DRF 序列化程序属性上

问题描述

我在这里遇到问题,无法找出发生了什么。

我有 DRF REST API,它必须接收一个 POST 来创建一个AlertRule对象和几个EmailAddress与之相关的对象。问题是,在调试验证器方法时,电子邮件数据应该出现在验证器方法的attr参数上,但是当我发送数据 obver http post 时它就不存在了。

我发送的示例:

{'alert_event_max_count': 2, 'alert_time_window': 2, 'company': 'Q29tcGFueToxNw==', 'company_id': 17, 'comparison_rule': 4, 'comparison_value': '0', 'daily_start_time': '07:00:00', 'daily_stop_time': '17:59:59', 'emails': [{'email':'bruno.carli@smartgreen.net'}], 'end_date': '2022-01-01', 'installation_ids': [], 'monitored_property_id': 30, 'name': 'kk', 'start_date': '2019-01-01', 'week_day_bitmask':17}

attr唯一显示:

OrderedDict([('alert_time_window', 2), ('alert_event_max_count', 2), ('company', <Company: Company object (17)>), ('comparison_rule', 4), ('comparison_value', '0'), ('daily_start_time', datetime.time(7, 0)), ('daily_stop_time', datetime.time(17, 59, 59)), ('end_date', datetime.date(2022, 1, 1)), ('installations', []), ('monitored_property', <Property: None - None>), ('name', 'loli'), ('start_date', datetime.date(2019, 1, 1)), ('week_day_bitmask', 17)])

'emails': [{'email':'bruno.carli@smartgreen.net'}], 我发送的数据在哪里?

这里的代码:

序列化器

class EmailSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ['id', 'email']
        model = EmailAddress


class AlertRuleSerializer(serializers.ModelSerializer):
    emails = EmailSerializer(many=True, required=False)
    
    ... # other fields

    class Meta:
        model = AlertRule
        fields = [
            ... # other fields
            'emails'
        ]
        depth = 2

def validate(self, attrs):  # pylint: disable=arguments-differ
        """
        Valida se as instalações recebidas são da mesma empresa da regra
        de alerta.
        """
        installations = attrs.get('installations', [])
        company = attrs.get('company')

        print(attrs)  # show received attributes data

        return attrs

楷模:

class EmailAddress(models.Model):
    alert_rule = models.ForeignKey(
        'AlertRule',
        related_name='emails',
        on_delete=models.CASCADE
    )
    email = models.EmailField(unique=True)

最后,AlertRule创建了,但没有创建任何电子邮件对象:/

'{"alert_time_window":2,"alert_event_max_count":2,"company":{"id":17,"name":"local3","cnpj":"93293944000185"},"comparison_rule":4,"comparison_value":"0","daily_start_time":"07:00:00","daily_stop_time":"17:59:59","end_date":"2022-01-01","id":25,"installations":[],"monitored_property":{"id":30,"measurement_unit":null,"name":null,"source_name":"internal_temperature","service":"","short_name":null},"name":"lol","start_date":"2019-01-01","week_day_bitmask":17,"emails":[]}'

任何提示?

标签: pythondjangowebdjango-rest-framework

解决方案


推荐阅读