django restframework - 用于创建m2m关系的Serializer

时间:2014-09-10 07:30:58

标签: django serialization django-rest-framework m2m

我正在使用django-restframework作为我的API。我创建了一个序列化器,它应该列出我的对象,并且应该能够创建它们。

我有一个Contact实体和Productlikes之间有一个标准m2m。

这是我的模特:

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邮递员和表单数据):

  • 发送products_of_interest = 1 - >工作(!!!)但仅适用于一种产品!
  • 发送products_of_interest = [1,2] - >需要pk而不是unicode
  • 发送products_of_interest = 1; 2 - >需要pk而不是unicode
  • 发送products_of_interest [0] = 1,products_of_interest [1] = 2 - >什么都没做完

我对序列化器有一些经验,所以我想,也许我需要告诉序列化器,我想给他不止一个产品。所以我在序列化器中添加了这个:

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

现在我收到了这个错误:

  

"<联系人:>"需要有一个领域的价值"联系"在此之前可以使用多对多关系。

我现在完全迷失了。我能做什么?我可能需要覆盖标准的rfw功能来保存一个该死的容易m2m,可以吗?

谢谢!

罗恩

1 个答案:

答案 0 :(得分: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

views.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/的网络前端:

以原始数据形式发布:     {         “products_of_interest”:[1,2,3]     }

- &GT;只是工作。