Джанго пытается преобразовать объект в UUID после сериализации - PullRequest
1 голос
/ 19 сентября 2019

Я создаю веб-приложение с 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... Я потратил целый день на эту проблему, и, возможно, я слишком устал и упустил базовый момент, но сейчас я действительно застрял и был бы признателен за любую помощь.

Спасибо за ваше время.

...