Я начал проект с идеей, с которой я справлюсь больше, чем я знаю, но эй ... некоторые из нас учатся глупо, верно?
В настоящее время есть 2 модели: User
модель, которая используеткласс AbstractUser
, а затем у меня есть модель Role
, которая предоставляет множество ролей, которые могут со временем меняться, поэтому мне нужно, чтобы она была динамичной.
Вот как выглядит мой api/models.py
:
from django.db import models
from django.contrib.auth.models import AbstractUser
from django import forms
class Role(models.Model):
'''
The Role entries are managed by the system,
automatically created via a Django data migration.
'''
CABLER = 1
CLIENT = 2
ENGINEER = 3
PROJECTMANAGER = 4
SALES = 5
PARTNER = 6
ADMIN = 6
ROLE_CHOICES = (
(CABLER, 'cabler'),
(CLIENT, 'client'),
(ENGINEER, 'engineer'),
(PROJECTMANAGER, 'project manager'),
(SALES, 'sales'),
(PARTNER, 'partner'),
(ADMIN, 'admin'),
)
id = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, primary_key=True)
def __str__(self):
return self.get_id_display()
class User(AbstractUser):
roles = models.ManyToManyField(Role, related_name='roles')
У меня несколько проблем, но в настоящее время, когда я использую почтальон или представления DRF API, я не могу создать пользователя с ролями или без ролей.
Попытка с ролями:
Direct assignment to the forward side of a many-to-many set is prohibited. Use roles.set() instead.
Попытка без ролей:
{
"roles": [
"This list may not be empty."
]
}
Теперь я знаю, что должен сначала создать пользователя, а затем назначить роль, однако я не могу найти способ сделать это черезAPI.
Вот мой UserSerializer
класс:
class UserSerializer(serializers.ModelSerializer):
# roles = serializers.CharField(source='get_roles_display', )
# roles = RoleSerializer(many=True, read_only=False, )
class Meta:
model = User
fields = ('url', 'username', 'password', 'email', 'roles')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop('password')
instance = User(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
Я видел рекомендации по созданию файла form.py
и добавлению метода сохранения, но я не уверен, что он применяется так, как это будетбыть строго API в качестве моего бэкэнда и будет реализовывать AngularJS для моего интерфейса.
Кроме того, каждый раз, когда я пытаюсь сохранить или обновить пользователя в сериализаторе, User.roles.id
возвращает пользователя, у которого нет атрибута с именем role...
Так что я надеюсь, что кто-то сможет помочь.Спасибо.