Sono novizio in python e resto django. Ma sono confuso. Qual è il modo migliore per aggiornare la relazione molti a molti nel framework django rest. Ho letto i documenti http://www.django-rest-framework.org/api-guide/relations/#manytomanyfields-with-a-through-model Per impostazione predefinita, i campi relazionali che hanno come target un ManyToManyField con un modello passante specificato sono impostati in sola lettura.Django Rest update molti a molti di id
Se si specifica esplicitamente un campo relazionale che punta a un ManyToManyField con un modello passante, assicurarsi di impostare read_only su True.
Quindi, se ho un codice
class Master(models.Model):
# other fields
skills = models.ManyToManyField(Skill)
class MasterSerializer(serializers.ModelSerializer):
skills = SkillSerializer(many=True, read_only=False)
Ciò restituirà abilità come elenco di oggetti. E non ho un modo per aggiornarli. Per quanto ho capito, Django preferisce lavorare con gli oggetti rispetto all'id oggetto quando si tratta di M2M. Se lavoro con yii o rails lavorerò con i modelli "through". Vorrei ottenere il campo skill_ids. Che potessi leggere e scrivere. E posso farlo per l'operazione di scrittura
class MasterSerializer(serializers.ModelSerializer):
skill_ids = serializers.ListField(write_only=True)
def update(self, instance, validated_data):
# ...
validated_data['skill_ids'] = filter(None, validated_data['skill_ids'])
for skill_id in validated_data['skill_ids']:
skill = Skill.objects.get(pk=skill_id)
instance.skills.add(skill)
return instance
Ma non riesco a farlo tornare skill_ids in campo. E lavoro per operazioni di lettura e scrittura.
Non è chiaro su ciò che si sta cercando di fare. Potresti aggiungere un esempio JSON di cosa vuoi inserire? – Linovia
{id: 123, first_name: "John", "skill_ids": [1, 2, 3]} – radzserg
Lo scenario comune: si ottiene un elenco di competenze e si opera con ID non su oggetti. Non ha senso inviare l'oggetto completo per aggiornare le relazioni. { "first_name": "John", "competenze": [ {id: 1, nome: "Nome 1"}, {id: 2, il nome: "Nome 2"}, ] } – radzserg