很抱歉,如果有人问过这个问题,但是我已经仔细阅读了文档,甚至还有其他一些StackOverflow问题,似乎没有一个能解决我的问题。我对Django有点陌生,所以很抱歉,如果在其他地方回答了这个问题。
(Django REST - Create object with foreign key using serializers) 仅按照此处建议的方式执行company_id无效。仍然没有到达那里。 还按照建议尝试了视图中的自定义创建功能,但也没有运气。
我有一个Company
类,它带有2个值(id 1和2),还有一个Project
类,其中包含一个返回到company_id
的外键Company
。 Project
必须正好为1 Company
。
现在,我无法执行POST来创建Project
。我尝试过专门引用company_id
,甚至尝试引用序列化程序中的嵌套序列化程序。似乎没有任何作用。
我可能更希望在POST中发送company_id
并在我GET时取回引用的对象。不过,在这一点上,我很高兴获得POST的支持。注意:默认的company_id
值为1
,因此我创建的第一个将实际起作用。只是所有后续的POST最终都会出现此错误:
(1062, "Duplicate entry '1-RANDOM' for key 'project_project_company_id_key_007f87f8_uniq'")
公司
# Model
from django.db import models
class Company(models.Model):
company = models.CharField(
max_length=50,
unique=True
)
# Serializer
from rest_framework import serializers
from api.company.models import Company
class CompanySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Company
fields = ('url', 'company')
# View
from rest_framework import viewsets
from api.company.serializers import CompanySerializer
from api.company.models import Company
class CompanyViewSet(viewsets.ModelViewSet):
queryset = Company.objects.all()
serializer_class = CompanySerializer
项目
# Model
from django.db import models
from django.core.validators import RegexValidator
from api.company.models import Company
class Project(models.Model):
DEFAULT_PK = 1
class Meta:
unique_together = (('company', 'key'),)
company = models.ForeignKey(
Company,
on_delete=models.CASCADE,
default=DEFAULT_PK,
blank=False
)
key = models.CharField(
max_length=8,
blank=False,
validators=[
RegexValidator(
regex='^[A-Z0-9\-]*$',
message='Project key can only contain uppercase alphanumeric or a hythen (-)',
code='invalid_key'
),
]
)
name = models.CharField(
max_length=50,
blank=False
)
description = models.CharField(
max_length=500,
blank=True
)
# Serializer
from rest_framework import serializers
from api.project.models import Project
from api.company.serializers import CompanySerializer
class ProjectSerializer(serializers.HyperlinkedModelSerializer):
#company = CompanySerializer(read_only=True) # Tried this to no avail.
class Meta:
model = Project
fields = ('url', 'key', 'name', 'description', 'company_id') # 'company' here did not work
# View
from rest_framework import viewsets
from rest_framework.response import Response
from api.project.serializers import ProjectSerializer
from api.project.models import Project
from api.project.models import Company
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
# Tried playing around with this from suggestion I find in other post. No luck
"""
def create(self, validated_data):
serializer = self.get_serializer(data=self.request.data)
company_id_for_contact = self.request.data.pop('company_id')
company_instance = Company.objects.filter(id=company_id_for_contact).first()
if not serializer.is_valid():
print(serializer.errors)
data = serializer.validated_data
serializer.save(company=company_instance)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
"""
数据
# Note: the first one will work (default company_id is 1. Next one will not)
curl \
-X POST \
-H 'Content-Type: application/json' \
-d '{"company_id":2,"key":"OTHER","name":"Other","description":"Other example."}' \
'http://0.0.0.0:8000/project/'
答案 0 :(得分:0)
哇,我应该再等10分钟,我会弄清楚的。
curl POST需要company
,而不是company_id
。在CompanySerializer
中不需要Project
引用。
由于我使用的是url
,因此我们只需要引用(http://0.0.0.0:8000/company/2/)
HyperlinkedModelSerializer
。
希望有人在遇到类似问题时发现了这个问题:)