Lorsque vous rédigez ceci:Django Rest erreur cadre: { "utilisateur": [ "Ce champ est obligatoire"]
curl -X POST -H "Authorization: Token sometoken" -d "url=someurl" 127.0.0.1:8000/create/
Je reçois l'erreur:
{"user":["This field is required."] with the ItemSerializer,
J'ai vu d'autres postes sur SO parlant de l'utilisation de perform_create, que j'essaie d'utiliser pour enregistrer l'objet utilisateur, mais cela ne fonctionne pas pour une raison quelconque. Perform_create fonctionne lorsque l'utilisateur est défini comme ceci:
user = serializers.CharField(
default=serializers.CurrentUserDefault()
)
Mais je veux utiliser l'objet utilisateur, non seulement Charfield stocker le nom d'utilisateur
Sérialiseurs:
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = UserModel
fields = ('pk', 'username', 'email', 'first_name', 'last_name')
read_only_fields = ('email',)
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['cat']
class CommentSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Comment
fields = [
'comment',
]
class ItemSerializer(serializers.HyperlinkedModelSerializer):
user = UserDetailsSerializer()
category = CategorySerializer(many=True)
thecomments = CommentSerializer(many=True)
timestamp = serializers.SerializerMethodField('get_mytimestamp')
def get_mytimestamp(self, obj):
return time.mktime(datetime.datetime.now().timetuple())
class Meta:
model = Item
fields = [
"url",
"user",
"timestamp",
"categories",
"thecomments",
]
Modèle:
Afficher:
class ItemCreateAPIView(generics.CreateAPIView):
serializer_class = ItemSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
Solution:
sérialiseur pour créer article:
views.py
class ItemCreateAPIView(generics.CreateAPIView):
serializer_class = CreateSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
poste:
curl -X POST -H "Authorization: Token sometoken" -d "url='someurl'" 127.0.0.1:8000/createitem/
Je reçois toujours la même erreur, mais il doit être dans la bonne direction, il est logique d'avoir quelque chose comme {'user': {required: False}}. J'ai également essayé user = UserDetailsSerializer (required = False, read_only = True) Mais cela donne: La méthode '.create()' ne supporte pas les champs imbriqués en écriture par défaut. Ecrivez une méthode explicite '.create()' pour le sérialiseur 'app.serializers.ItemSerializer' ou définissez' read_only = True' sur les champs de sérialiseurs imbriqués. – DevB2F
Btw l'erreur 'Ce champ est obligatoire' n'apparaît pas lors de l'utilisation des requêtes get, cela concerne la création de l'objet utilisateur lors de la publication. – DevB2F
delete 'user = UserDetailsSerializer()' dans 'ItemSerializer' quand tout va bien, serializer différent pour la publication et obtenir – Ykh