Обновление ManyToMany API REST для Django - PullRequest
0 голосов
/ 15 марта 2019

У меня возникла проблема при обновлении таблицы поиска для отношения «многие ко многим» между этапом и устройством. Я не нашел ответа на свой вопрос, но я не знаю, как правильно его описать, поэтому извините, если я создал повторяющийся вопрос.

Вот что у меня есть (короче):

# models.py

class Parent(models.Model):
    # other fields
    name = models.CharField(max_length=255)

class Stage(models.Model):
    # other fields
    parent = models.ForeignKey('Parent', related_name='stage', on_delete=models.CASCADE)
    desc = models.CharField(max_length=255)
    device = models.ManyToManyField('Device', related_name='stg', blank=True)

class Device(models.Model):
    # other fields
    name = models.CharField(max_length=255)

# serializer

class ParentSerializer(serializers.ModelSerializer):
    stages = serializers.SerializerMethodField()

    class Meta:
        model = Parent
        fields = '__all__'
        depth = 1

def get_stages(self, obj):
    stg = Stage.objects.filter(parent=obj.id)
    return StageSerializer(stg, many=True).data


# view.py
# In ParentCreate or ParentUpdate I try to update Stage manually

class ParentListCreate(generics.ListCreateAPIView):
    serializer_class = ParentSerializer
    model = Parent
    queryset = Experiment.objects.all()


    #after the Parent created we add new relationship between stage and device

    def create(self, request, *args, **kwargs):
         # after parent created I try to save existing Stage.
         stage = request.data.get('stage', None)
         stg = Stage.objects.get(id=stage["id"])
         stg.name = stage["desc"]
         stg.parent_id = parent_id
         stg.save()
         stg.device.add(Device.objects.get(id=s["device"]))

Поэтому я пытаюсь обновить отношение Stage-Device при создании Parent в views.py. Он создает связь между устройством и сценой, но проблема в том, что он продолжает добавлять новые строки в таблицу stage_device, сгенерированную Django.

Как я могу убедиться, что я обновляю старую строку stage_device вместо того, чтобы просто каждый раз создавать новую строку?

Любой вклад приветствуется!

...