django - لا يمكن إنشاء() علاقة متداخلة مع درف



django-rest-framework (2)

هذه هي المرة الأولى التي أعمل فيها مع درف.

نماذجي:

class ServiceCategory(models.Model):
    category = models.CharField(max_length=24)

class Service(models.Model):
    service = models.CharField(max_length=24)
    category = models.ForeignKey('ServiceCategory')

المتسلسلون:

class ServiceCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = ServiceCategory
        fields = ('id', 'category')

class ServiceSerializer(serializers.ModelSerializer):
    category = ServiceCategorySerializer()

    class Meta:
        model = Service
        fields = ('service', 'category')

    def create(self, data):
        return Service.objects.create(**data)

وجهة النظر:

elif request.method == 'POST':
    serializer = ServiceSerializer(data=request.data)

    print(serializer.initial_data) # To debug the contents of the request

    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

في البداية، قبل أن أضيف الفئة المتداخلة إلى سيرفيسزيرياليزر، لم يكن لدي أي مشكلة في إنشاء خدمات جديدة. نواتج print(serializer.initial_data) <QueryDict: {'category': ['1'], 'service': ['EC2']}> الواضح أنني أورد الفئة للطلب ولكني أحصل على "category" : ["This field is required"] أخطاء.

لذلك أنا أفكر في المشكلة قد تكون مع بلدي create(self, data) الأسلوب في سيرفيسزيرياليزر ولكن أنا غير قادر على وضع إصبع على ما هو بالضبط الخطأ معها.

ما فاتني؟

تحديث

بدون سيرفيسكاتيغوريزرياليزر في سيرفيسسيرياليزر، وجهة النظر كونها:

elif request.method == 'POST':
    serializer = ServiceSerializer(data=request.data)

    print(serializer.initial_data) # for debugging

    if serializer.is_valid():
        print(serializer.data) # for debugging

serializer.initial_data <QueryDict: {'category': ['1'], 'service': ['EC2']}> و serializer.data ترجع {'service': 'EC2', 'category': 1} افترض محتويات serializer.data هي ما سوف تحصل على تمرير إلى طريقة create() سيرفيسزيرياليزر. في حد ذاته، فإنه يعمل، ولكن عند تضمين سيرفيسكاتيغوريسيرياليزر داخله، لا تمر من خلال والحصول على نفس مزعج "category" : ["This field is required"]

لقد تم عالقة مع هذا لأكثر من 6 ساعات الآن. ما الذي يجري؟؟؟

https://ffff65535.com


عند نشر خدمة، يجب أن يحتوي حقل category على بيكاي، أي عدد صحيح. يحتوي حقل category في serializer.initial_data على قائمة تحتوي على سلسلة.

BTW1: يحتوي حقل service أيضا على قائمة عندما يتوقع نموذجك سلسلة ( CharField ). قد يكون هذا أيضا مشكلة.

BTW2: لا حاجة لتجاوز create سيرياليزر الخاص بك في قضيتك.


كما هو موضح في المستندات ، يجب تطبيق طريقة create() بطريقة مختلفة قليلا، حفظ الفئة أولا إذا لم يكن موجودا بعد، ثم تمريرها إلى الدالة Service.objects.create() ، مثل هذا ( لم تختبر ):

def create(self, validated_data):
    category_data = validated_data.pop('category')
    # 'created' will be True if no existing category matches
    category, created = ServiceCategory.objects.get_or_create(**category_data)
    return Service.objects.create(category=category, **validated_data)