2016-01-25 2 views
0

Я новичок в Django. Я сделал две модели, как это:Пример ассоциированной модели для ManyToManyField в Django

class A(models.Model): 
    title = models.CharField(max_length=255, null=False) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now_add=False, null=True) 
    b_assigned = models.ManyToManyField(B, related_name='b_assigned') 

    class Meta: 
     db_table = 'a_table' 


class B(models.Model): 
    name = models.CharField(max_length=255, null=False) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now_add=False, null=True) 

    class Meta: 
     db_table = 'b_table' 

сериализаторов для соответствующих классов:

class ASerializer(serializers.ModelSerializer): 
    b_assigned = BSerializer(many=True, required=True) 
    class Meta: 
     model = A 
     fields = ('id', 'title', 'b_assigned') 
     read_only_fields = ('id',) 

class BSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = B 
     fields = ('id', 'name') 
     read_only_fields = ('id',) 

У меня уже есть несколько объектов B в базе данных. Теперь для создания объекта A я должен предоставить массив объектов B. Как достичь этого, используя Django REST Framework.

Я знаю, мне нужно переопределить create и update в ASerializer. Но как добавить массив B, используя их идентификаторы, A. Я не хочу создавать новый экземпляр B при создании A. Хотите достичь этого, используя только REST Framework.

Разъяснение: Я отправляю идентификаторы B для создания/обновления A

+0

Как о получении идентификаторов Bs, что у вас есть в вашей базе данных, а затем добавить их в А-х b_assigned в вашем создать метод? Вам не нужно создавать новый экземпляр B. – Abhishek

+0

, вот пример этого, но он создает новые экземпляры: http://www.django-rest-framework.org/api-guide/serializers/#writing- создать-методу-для-гнездовых представлений –

ответ

2

Вам не нужно создавать новые объекты B. Насколько я понимаю вашу проблему, у вас возникла проблема с получением нескольких B в вашем переопределенном create и update. Есть два способа добиться этого, один из них - this, где вы создаете query_set, а затем итерируете на объект. Пример: B.objects.filter(id__in=[1, 3, 4]). В качестве альтернативы вы можете перебирать идентификаторы в своем методе, а затем получить их B s, а затем добавить их в Ab_associate.

Я ожидаю, что у вас есть b_associate в вашем запросе POST.

ids = b_associate.split(',') 
for id in ids: 
    b_obj = B.objects.get(id=id) 
    A.b_associate.add(b_obj) 
1

Я достиг такой же, как это, благодаря Abhishek для направления меня:

def create(self, validated_data): 
    a = A.objects.create(**validated_data) 
    a.save() 
    ids = self.initial_data['b_assigned'].split(',') 
    bs = B.objects.filter(id__in=ids) 
    for b in bs: 
     a.b_assigned.add(b) 
    return a