2017-08-23 2 views
1

J'ai actuellement la structure suivante dans mon API DRF.Django Rest DRF - Méthode Post utilisant des vues basées sur une classe générique (CreateAPIView) lorsqu'il existe une relation de clé étrangère

models.py

class Location(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    district = models.CharField(max_length=64, blank=True) 
    division = models.CharField(max_length=64, blank=True) 
    latitude = models.DecimalField(max_digits=9, decimal_places=3, blank=True) 
    longitude = models.DecimalField(max_digits=9, decimal_places=3, blank=True) 

class Event(models.Model): 
    title = models.CharField(max_length=64) 
    location = models.ForeignKey(Location, on_delete=models.CASCADE, blank=False, null=False) 
    type = models.CharField(max_length=64, blank=True) 
    max_quota = models.IntegerField(blank=True) 
    min_cost = models.IntegerField(blank=True) 
    duration_start = models.CharField(max_length=64, blank=True) 
    duration_end = models.CharField(max_length=64, blank=True) 

serializers.py

class LocationSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Location 
     fields = ['name', 'district', 'division', 'latitude', 'longitude', ] 

class ExperienceCreateSerializer(serializers.ModelSerializer): 
    location = LocationSerializer(many=False) 
    #location_id = serializers.PrimaryKeyRelatedField(read_only=True) 

    class Meta: 
     model = Experience 
     fields = ['title', 'type', 'max_quota', 'min_cost', 'duration_start', 'duration_end', 'location', ] 

views.py

class ExperienceCreate(generics.CreateAPIView): 
    queryset = Experience.objects.all() 
    serializer_class = ExperienceCreateSerializer 

Mes recevoir des demandes fonctionnent très bien, mais quand je veux POST aux modèles d'événements , alors je reçois toujours une sorte d'erreur. J'ai essayé pas mal de choses, y compris en remplaçant la méthode create, j'ai aussi essayé d'utiliser le primarykeyfield. Le problème réside dans la référence de la clé étrangère de localisation dans le modèle d'événement et dans les sérialiseurs. J'ai essayé quelques autres choses à part ça mais la seule solution logique était de surcharger la méthode create(). Mais, rien n'a fonctionné. Je ne comprends pas exactement où je vais mal.

+0

vous montrer la version de 'create()' –

+0

J'ai posé la même question avant. Je pense que vous trouverez ceci utile: https://stackoverflow.com/questions/41312558/django-rest-framework-post-nested-objects – wencakisa

+0

'code def créer (self, validated_data):' 'code loc_data = validated_data. pop ('location') ' ' code exp = Expérience.objects.create (** validated_data) ' ' code Experience.objects.create (emplacement = loc_data, ** données_de_piste) ' ' code return exp ' – flaire

Répondre

0

Eh bien, j'ai trouvé une solution de contournement pour cela. Si l'objet d'emplacement est déjà créé, alors ce que nous devons faire est de passer l'emplacement en tant que PrimaryKeyRelatedField dans le sérialiseur. N.B. le write_only doit être fait vrai

location = serializers.PrimaryKeyRelatedField(queryset=Location.objects.all(), write_only=True)