2017-10-20 17 views
0

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/ 

Répondre

0
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", 
     ] 
     extra_kwargs = {'user': {'required': False}} 

ajouter extra_kwargs = {'user': {'required': False}} à votre sérialiseur Meta

+0

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

+0

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

+0

delete 'user = UserDetailsSerializer()' dans 'ItemSerializer' quand tout va bien, serializer différent pour la publication et obtenir – Ykh