2017-01-26 3 views
0

eigentlich habe ich kein Formular, ich verwende derzeit die ViewSet API zu erstellen.Wie bekomme ich einen Fremdschlüssel in einen Formulareintrag? Python/Django

Ich habe zwei Modelle, ist ein regelmäßiges Benutzermodell und ein Gruppenmodell, das ein Feld creator mit ForeignKey den Benutzer

Ich habe ein Serializer dann benannt verwendet verwenden, um die POST Eingaben zu validieren, irgendwie ich halte auf den Fehler immer sagt

null value in column "creator_id" violates not-null constraint

Was ich verstehen kann, und ich getestet auch, dass es ist, weil creator_id null ist, wenn ich zu schreiben versuchen, aber ich habe die creator_id obwohl ein. Betrete ich es falsch oder wie bekomme ich den Fremdschlüssel, um ihn zu speichern?

Mein Gruppenmodell ist wie diese

class Group(Model): 
    creator = ForeignKey(User, 
         null=True, // I used this to test I am right with the error 
         blank=True, // I used this to test I am right with the error 
         on_delete=CASCADE, 
         related_name="%(class)ss", 
         related_query_name="%(class)s") 
    group_name = CharField(max_length=256, unique=True) 
    created_at = DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return self.group_name 

wieder, fügte ich null=True, blank=True ist, weil ich, wenn ich Recht habe sehen will, dass es wegen creator_id ist nicht null sein kann und ja, ich bin direkt nach der Zugabe von In diesen beiden Feldern bekomme ich den Fehler nicht mehr.

mein GroupSerializer

class GroupSerializer(ModelSerializer): 
    group_id = SerializerMethodField() 
    creator_name = SerializerMethodField() 
    creator_id = SerializerMethodField() 

    class Meta: 
     model = Group 
     fields = ['group_id', 'group_name', 'creator_id', 'creator_name'] 

    def get_group_id(self, obj): 
     return obj.id 

    def get_creator_name(self, obj): 
     return obj.creator.tutor_name 

    def get_creator_id(self, obj): 
     return obj.creator.id 

    def create(self, validated_data): 
     return Group.objects.create(**validated_data) 

mein view.py

@csrf_exempt 
    def create(self, request): 
     data = GroupSerializer(data=request.data) // this would return the `group_name` and `creator_id` I entered 
     if data.is_valid(): // this would return true 
      data.save() 
      return Response({'status': True}) 
     return Response({'status': False, 'message': data.errors}, status=400) 

Ich versuchte Posting mit ...

{ 
     "group_name": "bridge", 
     "creator_id": 1 
    } 

versucht "creator_id": "1" und "creator": "1"

immer noch den gleichen Fehler ...

Wie kann ich das beheben?

Vielen Dank im Voraus

Antwort

0

Ich glaube, Sie erklären Ihren Serializer falsch. Sie verwenden einen ModelSerializer, aber die Felder, die Sie in der Feldliste deklarieren, stimmen nicht mit den Feldern des Modells überein. Beachten Sie auch, dass fields eine Liste und kein Array ist. Ich denke, es sollte so sein.

class Group(Model): 
    creator = ForeignKey(User, 
         on_delete=CASCADE, 
         related_name="%(class)ss", 
         related_query_name="%(class)s") 
    group_name = CharField(max_length=256, unique=True) 
    created_at = DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return self.group_name 

class GroupSerializer(ModelSerializer): 
    class Meta: 
     model = Group 
     fields = ('creator', 'group_name', 'created_at') 

auch weiß, dass ich Sie um es zu testen taten, aber die als schlechte Praxis sowohl null=True und blank=True auf dem gleichen Feld zu erklären. Es sollte das eine oder andere sein.

die hier docs Siehe: http://www.django-rest-framework.org/api-guide/serializers/#modelserializer

+0

Ich kann verstehen, was du meinst, aber was, wenn ich will 'creator' in' creator_id' ändern? Hier stecke ich fest. Sagen wir, ich weiß, dass das Modell 'group_name' verwendet, aber ich kann es in 'g_name' ändern, wenn ich das 'SerializerMethodField' möchte. – Dora

+0

In Ihrem Modell ist' creator' ein ForeignKey. In Django bezieht es sich also nicht auf eine ID-Nummer, sondern auf ein anderes Modell (in diesem Fall "Benutzer"). Dieses Modell hat sein eigenes ID-Feld. Wenn Sie die 'creator_id' wollten, wäre das tatsächlich' creator.id', da dies sich auf das 'User' models 'id'-Feld bezieht. – joed4no

+0

deshalb habe ich 'def get_creator_id (self, obj): return obj.creator.ID ', die dann in die' Felder 'des Serialisierers eingegeben wird, oder wie kann ich dann die ID des Erstellers erhalten? – Dora

Verwandte Themen