python - Nested relationships in django rest framework -
i want register new user associated list of categories.
i have table called categories list of unique categories (category id, category name).
i have table called accounts list of users (username, email, password , list of associated categories).
i have table called account_categories mapping between users , categories.
unfortunately when trying create new user receive error provided categories exists. don't want update categories table. want update accounts , account_categories.
what doing wrong?
model.py
class category(models.model): categoryname = models.charfield(unique=true, max_length=50) def __str__(self): return "{0}".format(self.categoryname) class accountmanager(baseusermanager): def create_user(self, email, age, categories, password=none, **kwargs): if not email: raise valueerror('users must have valid email address.') if not kwargs.get('username'): raise valueerror('users must have valid username.') if not age: raise valueerror('users must have valid age.') if not categories: raise valueerror('users must choose @ least 1 intrest.') account = self.model( email=self.normalize_email(email), age=age, categories=categories, username=kwargs.get('username') ) account.set_password(password) account.save() return account def create_superuser(self, email, age, categories, password, **kwargs): account = self.create_user(email=email, age=age, categories=categories, password=password, **kwargs) account.is_admin = true account.save() return account class account(abstractbaseuser): email = models.emailfield(unique=true) username = models.charfield(unique=true, max_length=25) age = models.smallintegerfield() categories = models.manytomanyfield(category) objects = accountmanager() username_field = 'username' required_fields = ['age', 'email'] def __unicode__(self): return self.email
serializers.py
class categoryserializer(serializers.modelserializer): class meta: model = category fields = ('id', 'categoryname') class accountserializer(serializers.modelserializer): password = serializers.charfield(write_only=true, required=false) confirm_password = serializers.charfield(write_only=true, required=false) categories = categoryserializer(many=true) class meta: model = account fields = ('id', 'email', 'username', 'age', 'categories', 'password', 'confirm_password',) def create(self, validated_data): return account.objects.create(**validated_data)
views.py
class accountviewset(viewsets.modelviewset): lookup_field = 'username' queryset = account.objects.all() serializer_class = accountserializer def get_permissions(self): if self.request.method in permissions.safe_methods: return (permissions.allowany(),) if self.request.method == 'post': return (permissions.allowany(),) return (permissions.isauthenticated(), isaccountowner(),) def create(self, request): serializer = self.serializer_class(data=request.data) if serializer.is_valid(): account.objects.create_user(**serializer.validated_data) return response(serializer.validated_data, status=status.http_201_created) return response({ 'status': 'bad request', 'message': 'account not created received data. email / username has been used.' + str(serializer.errors) + str(request.data) #+ str(serializer.is_valid()) }, status=status.http_400_bad_request)
database scheme
http://postimg.org/image/o15ybcf9f/
error
Comments
Post a Comment