Django Rest Framework, создание отношения полей "один-ко-многим" между пользователями и другой моделью

Я пытаюсь создать простую модель, которая хранит число в качестве первичного ключа (номер недели), а затем список пользователей. Таким образом, модель должна быть примерно такой,

{
  id: 10,
  users: [
    user1,
    user2,
    ...
  ]
}

Я почти уверен, что должен сделать это с помощью поля "один ко многим". Таким образом, я создал следующую модель,

class Schema(models.Model):
    week = models.PositiveIntegerField(primary_key=True, 
                                       unique=True,
                                       validators=[MinValueValidator(1), MaxValueValidator(53)],
                                       )
    users = models.ForeignKey(MyUser, related_name="users", null=True, blank=True, on_delete=models.SET_NULL)

    class Meta:
        ordering = ('week',)

Я хочу, чтобы при выполнении POST запроса с id и списком пользователей, модель просто создавалась. Однако если id уже существует, то он должен просто очистить пользователей и добавить новых пользователей вместо него. На этом я и застрял, я попробовал следующее (сохраняя комментарии в коде),

class SchemaSerializer(serializers.ModelSerializer):
    # users = serializers.PrimaryKeyRelatedField(many = True, queryset = MyUser.objects.all())

    # user_set = UserSerializer(many = True) 

    class Meta:
        model = Schema
        fields = ('week', 'users')

    # def create(self, validated_data):
    #     # users_data = validated_data.pop('users')
    #     schema = Schema.objects.create(**validated_data)
    #     # answer, created = Schema.objects.update_or_create(
    #     #     week=validated_data.get('week', 1),
    #     #     defaults={'users', validated_data.get('users', [])}
    #     # )
    #     return schema

    def update(self, instance, validated_data):
        users_data = validated_data.pop('users')
        instance.users.clear()
        instance.save()

        for user in users_data:
            instance.users.add(user)
        instance.save()
        return instance

Еще одна проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как запрос ожидает данные, например, от Postman, я бы подумал, что ему нужен только идентификатор пользователя и, конечно, идентификатор модели (неделя), однако это одна из вещей, которые я пробовал,

{
    "week": 32,
    "users": [{
        "id": 1,
        "first_name": "Test",
        "last_name": "test",
        "email": "test@test.dk"
    }]
}

ForeignKey не будет работать для вас. Если один объект Schema должен иметь много отношений с моделью User, то вы должны использовать отношения ManyToMany (django docs). Так в вашей модели:

class Schema(models.Model):
    week = models.PositiveIntegerField(primary_key=True, 
                                       unique=True,
                                       validators=[MinValueValidator(1), MaxValueValidator(53)],
                                       )
    users = models.ManyToManyField(MyUser, related_name="users")

    class Meta:
        ordering = ('week',)

для части обновления я думаю, что вам нужно передать объект пользователя, а не id в add(), поэтому я бы попробовал:

 def update(self, instance, validated_data):
        users_data = validated_data.pop('users')
        users = User.object.filter(id__in=user_data)
        instance.users.clear()
        instance.users.add(*users)
        instance.save()
        return instance

Для api представления я рекомендую прочитать эту тему на stack: REST ManyToMany

Вернуться на верх