Hi Tom,
Unfortunately I think our wires are a little crossed. Your response helps with PUT requests for updates but I still have the validate_category being called when I am creating a new Question and posting existing categories to be added to that question with the Question form. If I move the validation to the save then I can get past the issue. If you picture a form with a question input box and category multi select filled with existing categories. Then when I post the question to save a new question, the new question and existing categories get posted and I then save the question and apply each category to the question. However because I have a validate_category method on the CategorySerializer this seems to be called because I presume it expects that I could be creating new categories at the same time instead of using existing ones posted? Is there a way around this issue? I will post the code so you can get a better picture.
<code>
class CategorySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Category
fields = ('pk', 'category', 'user', 'url')
user = serializers.ReadOnlyField(source='user.username')
def validate_category(self, category):
if self.instance is not None:
#update
category_exists = Category.objects.filter(user=None,
category__iexact=category)
else:
#insert
category_exists = Category.objects.filter(Q(user=self.context['request'].user) | Q(user=None),
category__iexact=category)
if category_exists:
raise serializers.ValidationError({'category': 'Category %s already exists.'
% category})
return category
class QuestionSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Question
fields = ('pk', 'question', 'user', 'url', "categories")
categories = CategorySerializer(many=True)
user = serializers.ReadOnlyField(source='user.username')
def create(self, validated_data):
categories = validated_data.pop('categories', None)
question = Question.objects.create(**validated_data)
if categories:
for category in categories:
try:
# Check if user category already exists and use it.
c = Category.objects.get(user=self.context['request'].user,
**category)
except Category.DoesNotExist:
# Check if default category already exists and use it.
c = Category.objects.get(user=None,
**category)
except Category.DoesNotExist:
# Category does exist, create new one.
c = Category.objects.create(user=self.context['request'].user,
**category)
question.categories.add(c)
return question
</code>