Я создаю веб-приложение с Django и Django-rest-framework.Вот мои модели:
class Affilie(TimeStampedModel):
TITRE = (
('Monsieur', 'Monsieur'),
('Madame', 'Madame'),
)
TYPE_CONTACT = (
('Courrier', 'Courrier'),
('Mail', 'Mail'),
)
uuid = models.UUIDField(
db_index=True,
default=uuid_lib.uuid4,
editable=False,
unique=True,
primary_key=True
)
titre = models.CharField(max_length=8, choices=TITRE)
nom = models.CharField(max_length=25)
prenom = models.CharField(max_length=25)
id_federation = models.CharField(
max_length=50, unique=True, blank=True)
adresse = models.ForeignKey(
'utils.Adresse',
on_delete=models.SET_NULL,
null=True,
related_name='affilies'
)
mail = models.EmailField(validators=[EmailValidator(
message="Veuillez entrer une adresse mail valide")], blank=True)
telephone = models.CharField(
max_length=14,
blank=True,
validators=[
RegexValidator(
regex=r"^(0\d{8}|04[5-9]\d{7}|(00|\+)\d{2,3}4[5-9]\d{7})$",
message="Le numéro de téléphone n'a pas un format valide"
)])
type_contact = models.CharField(max_length=8, choices=TYPE_CONTACT)
date_naissance = models.CharField(max_length=10, blank=True)
inscrit_cours = models.BooleanField(default=False)
membre_arista = models.BooleanField(default=False)
membre_comite = models.BooleanField(default=False)
class Affiliation(models.Model):
TYPE_AFFILIATION = Choices(
('BA', 'Belgique apicole + Assurance'),
('BARF', 'Belgique apicole + Assurance + "Abeilles et fleurs"'),
('BASA', 'Belgique apicole + Assurance + "Santé de l\'abeille"'),
('BAAF', 'Belgique apicole + Assurance + "Abeille de France"'),
('AR', 'Sans abonnement ni assurance'),
)
uuid = models.UUIDField(
db_index=True,
default=uuid_lib.uuid4,
editable=False,
unique=True,
primary_key=True
)
annee = models.SmallIntegerField(
db_index=True,
validators=[
MinValueValidator(2015),
MaxValueValidator(datetime.date.today().year + 2)
],
default=datetime.date.today().year,
)
type_affiliation = models.CharField(
max_length=4, choices=TYPE_AFFILIATION, blank=True, null=True)
payee = models.BooleanField(default=False)
date_payement = models.DateField(null=True, blank=True)
affilie = models.ForeignKey(
'Affilie',
related_name='affiliations',
on_delete=models.CASCADE,
editable=False,
)
class Meta:
ordering = ('payee', 'type_affiliation')
unique_together = ('annee', 'affilie')
Таким образом, идея состоит в том, что у Affilie есть одна принадлежность в год.Поэтому он может иметь несколько филиалов, чтобы отслеживать свои предыдущие (или будущие) филиалы.
Я использую Django-rest-framework, поэтому мне нужно создать сериализаторы:
class AffilieSerializer(serializers.ModelSerializer):
adresse = AdresseSerializer()
class Meta:
model = Affilie
fields = [
'uuid', 'titre', 'prenom', 'nom', 'id_federation',
'adresse', 'mail', 'telephone', 'type_contact',
'date_naissance', 'membre_arista', 'membre_comite'
]
class AffiliationSerializer(serializers.ModelSerializer):
class Meta:
model = Affiliation
fields = [
'uuid', 'annee',
'type_affiliation', 'payee',
'date_payement'
]
class AffiliationWithAffilieSerializer(serializers.ModelSerializer):
affilie = AffilieSerializer()
class Meta:
model = Affiliation
fields = [
'uuid', 'annee', 'affilie',
'type_affiliation', 'payee',
'date_payement'
]
ПРИМЕЧАНИЕ:У меня также есть собственные методы создания и обновления, но моя проблема, похоже, не в этих.
Просто некоторые "автоматические" сериализаторы, созданные с помощью ModelSerializer.Теперь мне нужно закончить, чтобы написать несколько просмотров и URL:
class AffiliationWithAffilieListAPIView(generics.ListAPIView):
"""
This view should return all Affiliations and their Affilie for a fixed year
URL: /api/affiliation/list/:year
"""
permission_classes = [IsAuthenticated, ]
serializer_class = AffiliationWithAffilieSerializer
lookup_field = 'uuid'
def get_queryset(self):
return Affiliation.objects.filter(annee=self.kwargs['year'])
class AffiliationWithAffilieCreateAPIView(generics.CreateAPIView):
"""
This view should create an Affiliation and his linked Affilie
URL: /api/affiliation/create/
"""
permission_classes = [AllowAny]
serializer_class = AffiliationWithAffilieSerializer
lookup_field = 'uuid'
queryset = Affiliation.objects.all()
urls.py
urlpatterns = [
#
# AFFILIATIONS
#
# List all affiliations with their affilie by year
# /api/affiliation/list/:year GET
url(
r'^list/(?P<year>\d{4})/$',
views.AffiliationWithAffilieListAPIView.as_view(),
name='affiliations-with-affilie-by-year'
),
#
# Create
# /api/affiliation/create/
url(
r'^create/$',
views.AffiliationWithAffilieCreateAPIView.as_view(),
name='affiliation-create'
)
]
Моя проблема заключается в том, что я хочу создать филиал и филиал с этим URL: / api / affiliation / create / Для этого у меня есть форма в моем веб-интерфейсе, и я отправляю этот последний запрос с axios:
axios.post(
'http://localhost/api/affiliation/create/',
this.affiliation
)
, где this.affiliation:
{"annee":2019,"affilie":{"uuid":"","titre":"Madame","nom":"Dubois","prenom":"Jeanne","id_federation":"","mail":"jeanne.dubois@gmail.com","telephone":"0483378212","type_contact":"Mail","date_naissance":"18/11/1998","membre_arista":false,"membre_comite":true,"adresse":{"numero":"127","rue":"rue du cerf","code_postal":"6700","localite":"Bonnert"}},"type_affiliation":"","payee":false}
Но у меня есть 400 ответов, которые, похоже, получены от валидаторов django:
400: {"non_field_errors":["La valeur « OrderedDict([('titre', 'Madame'), ('prenom', 'Jeanne'), ('nom', 'Dubois'), ('id_federation', ''), ('adresse', OrderedDict([('numero', 127), ('rue', 'rue du cerf'), ('localite', 'Bonnert'), ('code_postal', 6700)])), ('mail', 'jeanne.dubois@gmail.com'), ('telephone', '0483378212'), ('type_contact', 'Mail'), ('date_naissance', '18/11/1998'), ('membre_arista', False), ('membre_comite', True)]) » n'est pas un UUID valide."]}
Я действительно не понимаю, почему django пытается «преобразовать» мой объект affilie в данные, которые я отправляю, в UUID... Я потратил целый день на эту проблему, и, возможно, я слишком устал и упустил базовый момент, но сейчас я действительно застрял и был бы признателен за любую помощь.
Спасибо за ваше время.