python - جانغو الراحة الإطار 3.0: إنقاذ متداخلة، علاقة متعددة إلى واحد



django serialization (1)

المشكلة هي أن PriceSerializer الخاص بك يبحث عن مفتاح item لأنه يتم تحديده على نموذج Price . هذا ليس واضحا على الفور لأنك تستخدم Meta.exclude بدلا من Meta.fields .

class PriceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Price
        exclude = ('user',)

هو نفس الكتابة

class PriceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Price
        fields = ('id', 'item', 'name', 'cost', )

مما يجعل من الواضح ما هي مشكلتك. لأن حقل item الخاص بك على نموذج لا يكون empty=True (أو null=True ) مجموعة، إطار دجانغو ريست تلقائيا PrimaryKeyRelatedField ك PrimaryKeyRelatedField مع required=True . هذا هو السبب في أنك تحصل على This field is required مطلوب خطأ، لأن دجانغو ريست الإطار لا يمكن الكشف تلقائيا أنه قادم من المسلسل الأم الذي لديه بالفعل هذا المجال.

يمكنك الحصول على جميع أنحاء هذا عن طريق إزالة الحقل من المسلسل، كما لا يبدو أن هناك حاجة إلى أي وقت مضى.

class PriceSerializer(serializers.ModelSerializer):

    class Meta:
        model = Price
        fields = ('id', 'name', 'cost', )

هذا لن يعرض حقل item الرغم من، ولكن أظن أن هذا ليس في الواقع قضية بالنسبة لك.

أنا محاولة لبناء علاقة متداخلة باستخدام جانغو الراحة الإطار 3.0. لقد قمت بإنشاء سيرياليزرز بلدي وحاولت تجاوز وظيفة create() . وتعرف نماذجي على النحو التالي:

class Item(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=1000)
    categories = models.ManyToManyField(Category, null=True, blank=True)

class Price(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    item = models.ForeignKey(Item, related_name='prices')
    name = models.CharField(max_length=100)
    cost = models.FloatField()

كما ستلاحظ، يمكنني الحصول على أسعار متعددة لبنود بلدي. يتم تعريف مسلسلاتي كما يلي:

class PriceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Price
        owner = serializers.Field(source='owner.username')
        exclude = ('user',)

class ItemSerializer(serializers.ModelSerializer):
    prices = PriceSerializer(many=True, required=False)
    categories = CategorySerializer(many=True, required=False)

    class Meta:
        model = Item
        owner = serializers.Field(source='owner.username')
        fields = ('id', 'name', 'description', 'prices', 'categories')

    def create(self, validated_data):
        user = validated_data.get('user')

        # Get our categories
        category_data = validated_data.pop('categories')

        # Create our item
        item = Item.objects.create(**validated_data)

        # Process the categories. We create any new categories, or return the ID of existing
        # categories.
        for category in category_data:
            category['name'] = category['name'].title()
            category, created = Category.objects.get_or_create(user=user, **category)
            item.categories.add(category.id)

        item.save()

        return item

عند محاولتي إضافة عنصر جديد:

{
    "name": "Testing",
    "description": "This is a test",
    "categories": [
        {
            "name": "foo"
        },
        {
            "name": "bar"
        }
    ],
    "prices": [
        {
            "name": "Red",
            "cost": 10
        }
    ]
}

أحصل على الخطأ التالية:

{
    "prices": [
        {
            "item": [
                "This field is required."
            ]
        }
    ]
}

ويفترض أن المسلسل السعر ليس لديه فكرة ما معرف العنصر الجديد هو. لقد حاولت تجاوز هذه الوظيفة في وظيفة create() من بلدي المسلسل، ولكن يبدو كما لو أن التحقق من المسلسل يتم ضرب قبل أن تتاح لي الفرصة لإنشاء هذا البند وربطه مع السعر.

لذلك - كيف يمكنني إنشاء عنصر جديد، والحصول على معرف البند، ومن ثم إنشاء كل من الأسعار الجديدة؟