【发布时间】:2017-04-25 18:47:05
【问题描述】:
我有两个这样的模型:
class Sector(models.Model):
name = models.CharField(max_length=100, db_index=True, unique=True) # HERE IF I REMOVE unique=True, it works correctly
class Address(models.Model):
...
sector = models.ForeignKey(Sector, null=True, blank=True)
还有一个地址模型的序列化器:
在视图中,我有这个:
address_serialized = AddressSerializer(data=request.data)
if address_serialized.is_valid():
address_serialized.save(client=client)
它永远不会到达create 函数。我有一个序列化的创建函数,如下所示:
class AddressSerializer(serializers.ModelSerializer):
city_gps = CitySerializer(required=False)
sector = SectorSerializer(required=False)
class Meta:
model = Address
fields = (..., "sector")
def create(self, validated_data):
...
sector_dict = validated_data.get("sector", None)
sector = None
if sector_dict and "name" in sector_dict and city_gps:
if Sector.objects.filter(name=sector_dict["name"], city=city_gps).exists():
sector = Sector.objects.get(name=sector_dict["name"], city=city_gps)
# pdb.set_trace()
if "sector" in validated_data:
validated_data.pop("sector")
if "city_gps" in validated_data:
validated_data.pop("city_gps")
address = Address.objects.create(sector=sector, city_gps=city_gps, **validated_data)
return address
代码从不接触这个函数,is_valid() 返回 False。消息是
{"sector":{"name":["同名的扇区已经存在。"]}}
我需要能够使用 FK 为现有扇区创建一个新地址。我怎样才能做到这一点?任何建议都会有所帮助。
编辑
视图如下所示:
class ClientProfileAddressCreateView(APIView):
# throttle_scope = '1persecond'
renderer_classes = (JSONRenderer,)
permission_classes = (IsAuthenticated,)
def post(self, request):
try:
client = Client.objects.get(user=request.user)
except ObjectDoesNotExist:
return Response({"error": "A client profile for the logged user does not exit"},
status=status.HTTP_404_NOT_FOUND)
address_serialized = AddressSerializer(data=request.data)
print("address_serialized.is_valid: %s" % address_serialized.is_valid()) # Returns False when unique=True in models
if address_serialized.is_valid():
# print("address_serialized: %s" % address_serialized.data)
address_serialized.save(client=client)
else:
return Response(data=address_serialized.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(data=address_serialized.data, status=status.HTTP_201_CREATED)
【问题讨论】:
-
您可能想尝试
is_valid(raise_exception=True)进行诊断...django-rest-framework.org/api-guide/serializers/… -
您能给我们提供您的意见吗?在
serializer中更改required=True也会改变什么吗? -
另外,您能否检查您的数据库中是否有包含 None/Blank 的扇区条目?
-
@BorkoKovacev 我添加了视图。不确定“检查我的数据库以获取其中包含无/空白的扇区条目”是什么意思……带有空扇区的地址?
-
@alejoss 感谢您的意见。我将尝试一些我认为会导致问题的方法,并将在几个小时内回答。是的,带有空扇区的地址,很抱歉造成混淆。
标签: django django-rest-framework