1

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

我有一个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 --> 有效(!!!)但仅适用于一种产品!
  • 发送 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)

现在我得到这个错误:

"<Contact: >" 需要为字段 "contact" 设置一个值,然后才能使用这种多对多关系。

我现在完全迷路了。我能做些什么?不可能我需要重写标准 rfw 函数来保存该死的简单 m2m,可以吗?

谢谢!

罗恩

4

1 回答 1

3

你使用的是什么版本的 Django 和 drf?我无法使用 Django 1.7 和 drf 2.4.2 重现您的错误。这是我的代码:

模型.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")

序列化程序.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

网址.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 回答