-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserializer.py
More file actions
165 lines (140 loc) · 4.86 KB
/
serializer.py
File metadata and controls
165 lines (140 loc) · 4.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
from rest_framework import serializers
from .models import Produto
class ProdutoSerializer(serializers.ModelSerializer):
"""
Serializer completo para o modelo Produto.
Responsável por:
- Serializar e desserializar dados
- Validar entradas
- Criar e atualizar instâncias do modelo
"""
class Meta:
model = Produto
# Campos explicitamente definidos (boa prática)
fields = [
'id',
'nome',
'marca',
'preco',
'descricao',
'estoque',
'ativo',
'criado',
'atualizado'
]
# Campos somente leitura
read_only_fields = ['id', 'criado', 'atualizado']
# Configurações extras de validação
extra_kwargs = {
'nome': {
'required': True,
'allow_blank': False,
'max_length': 80,
'error_messages': {
'blank': 'O nome do produto não pode estar vazio.',
'required': 'O nome do produto é obrigatório.'
}
},
'marca': {
'required': True,
'allow_blank': False,
'error_messages': {
'blank': 'A marca não pode estar vazia.',
'required': 'A marca é obrigatória.'
}
},
'preco': {
'required': True,
'error_messages': {
'required': 'O preço é obrigatório.',
'invalid': 'Informe um valor numérico válido.'
}
},
'descricao': {
'required': True,
'allow_blank': False,
'error_messages': {
'blank': 'A descrição não pode estar vazia.',
'required': 'A descrição é obrigatória.'
}
}
}
"""
read_only_fields = Impede alteração de campos
required = Torna o campo obrigatório
allow_blank = Proíbe string vazia
error_messages = Personaliza erros
extra_kwargs = Configura campos sem recriá-los
"""
# ============================
# Validações por campo
# ============================
def validate_preco(self, value):
"""
Validação específica do campo preço
"""
if value <= 0:
raise serializers.ValidationError(
'O preço deve ser maior que zero.'
)
return value
def validate_nome(self, value):
"""
Validação específica do nome
"""
if len(value) < 3:
raise serializers.ValidationError(
'O nome deve ter pelo menos 3 caracteres.'
)
return value
def validate_marca(self, value):
"""
Validação específica do nome
"""
if len(value) < 3:
raise serializers.ValidationError(
'A marca deve ter pelo menos 3 caracteres.'
)
return value
def validate_descricao(self, value):
if len(value) < 3:
# ERRO AQUI: Deve ser 'serializers' (o nome da biblioteca importada)
raise serializers.ValidationError(
'A Descrição deve ter pelo menos três caracteres'
)
return value
# ============================
# Validação geral do objeto
# ============================
def validate(self, data):
"""
Validação cruzada entre campos
"""
nome = data.get('nome')
marca = data.get('marca')
if nome and marca and nome.lower() == marca.lower():
raise serializers.ValidationError(
'O nome do produto não pode ser igual à marca.'
)
return data
# ============================
# Métodos de criação e atualização
# ============================
def create(self, validated_data):
"""
Cria um novo produto
"""
produto = Produto.objects.create(**validated_data)
return produto
def update(self, instance, validated_data):
"""
Atualiza um produto existente
"""
instance.nome = validated_data.get('nome', instance.nome)
instance.marca = validated_data.get('marca', instance.marca)
instance.preco = validated_data.get('preco', instance.preco)
instance.descricao = validated_data.get('descricao', instance.descricao)
instance.estoque = validated_data.get('estoque', instance.estoque)
instance.ativo = validated_data.get('ativo', instance.ativo)
instance.save()
return instance