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