我正在使用django-restframework
作为我的API。我创建了一个序列化器,它应该列出我的对象,并且应该能够创建它们。
我有一个Contact
实体和Product
。 likes
之间有一个标准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 = ProductSerializer(many=True, required=False, read_only=False)
现在我收到了这个错误:
"<联系人:>"需要有一个领域的价值"联系"在此之前可以使用多对多关系。
我现在完全迷失了。我能做什么?我可能需要覆盖标准的rfw功能来保存一个该死的容易m2m,可以吗?
谢谢!
罗恩
答案 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;只是工作。