1

django-restframeworkAPIに使用しています。オブジェクトをリストし、それらを作成できるシリアライザーを作成しました。

私はContactエンティティとを持っていますProduct。の間の標準的な m2m がありlikesます。

これが私のモデルです:

class Contact(models.Model):
    ...
    products_of_interest = models.ManyToManyField(Product, related_name="interested_contacts")

私のシリアライザは、次のように単純です。

class ContactSerializer(serializers.ModelSerializer):

    class Meta:
        model = Contact

このシリアライザーを介して連絡先を一覧表示すると、すべての連絡先オブジェクトが製品 ID の配列と共に取得されます。

"products_of_interest": [
        1,
        2
    ]

ここで、連絡先を作成して m2m に入力したい場合、(Chrome Postman とフォームデータを介して) 以下を取得します。

  • Products_of_interest = 1 を送信 --> 動作します (!!!) が、1 つの製品に対してのみです!
  • products_of_interest = [1,2] を送信 --> ユニコードではなく pk が必要
  • Products_of_interest = 1;2 を送信 --> ユニコードではなく pk が必要
  • products_of_interest[0] = 1, products_of_interest[1] = 2 を送信 --> 何も行われません

私はシリアライザーの経験がある程度あるので、シリアライザーに複数の製品を提供したいということを伝える必要があるのではないかと考えました。だから私はシリアライザーにこれを追加しました:

products_of_interest = ProductSerializer(many=True, required=False, read_only=False)

今、私はこのエラーを受け取ります:

この多対多の関係を使用するには、「<Contact: >」に「contact」フィールドの値が必要です。

私は今完全に迷っています。私に何ができる?非常に簡単なm2mを保存するために、標準のrfw関数をオーバーライドする必要があるということはあり得ませんよね?

ありがとう!

ロン

4

1 に答える 1

3

Django と drf のどのバージョンを使用していますか? Django 1.7 と drf 2.4.2 を使用してエラーを再現できません。これが私のコードです:

models.py

from django.db import models

class Product(models.Model):
    pass


class Contact(models.Model):
    products_of_interest = models.ManyToManyField(Product,
        related_name="interested_contacts")

serializers.py

from .models import Contact
from rest_framework import serializers


class ContactSerializer(serializers.ModelSerializer):
    class Meta:
        model = Contact

ビュー.py

from rest_framework import viewsets
from .models import Contact
from .serializers import ContactSerializer

class ContactViewSet(viewsets.ModelViewSet):
    queryset = Contact.objects.all()
    serializer_class = ContactSerializer

urls.py

from django.conf.urls import include, url

from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register(r'contacts', views.ContactViewSet, 'contacts')
urlpatterns = router.urls

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

./manage.py shell
>>> from m2m_test.models import Product
>>> for i in range(3): Product.objects.create()
...
<Product: Product object>
<Product: Product object>
<Product: Product object>
>>>

そして、ウェブフロントエンドでhttp://localhost:8000/contacts/

生データ形式の POST: { "products_of_interest": [1, 2, 3] }

-> 動作します。

于 2014-09-10T10:33:32.577 に答える