【发布时间】:2020-08-04 23:23:19
【问题描述】:
在我的 django 应用程序中,发生了一些奇怪的事情,我不明白。
我有两个不同的表(employeeProfile 和 purchaserShippingDetail),每个表都有一个与 OneToOneField 关系的字段,但第一个表(employeeProfile) 在使用 OneToOneField 的字段 user 中,我可以使用 api 传递字符串表示,例如 Michael 并且我没有收到错误,但在我的第二个表中具有类似的结构当我添加一个字符串表示时,我得到了
IntegrityError at /api/clients/shipping/ “owner_id”列中的空值违反非空约束
第一个表模型(工作正常)
class employeeProfile(models.Model):
image = models.ImageField(default='default.png',upload_to='employee_photos/%Y/%m/%d/')
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name="employee_profile")
phone_no = models.CharField(max_length=10, unique=True)
def __str__(self):
return self.user.name
第二个表模型(抛出“owner_id”的那个违反了非空约束错误)
class purchaserShippingDetail(models.Model):
frequent_customer = models.BooleanField(default=False)
owner = models.OneToOneField(Purchaser, on_delete=models.CASCADE, related_name="purchaser_shipping")
address = models.CharField(max_length=12, blank=True)
zip_code = models.CharField(max_length=12, blank=True)
location = models.CharField(max_length=255)
def __str__(self):
return self.owner.name
购买者型号
class Purchaser(models.Model):
name = models.CharField(max_length=50)
phone = models.CharField(max_length=20, unique=True)
email = models.EmailField(max_length=255, unique=True, blank=True)
data_added = models.DateField(default=datetime.date.today)
def __str__(self):
return self.name
purchaserShippingDetail 模型的序列化器
class purchaserShippingDetailSerializer(serializers.ModelSerializer):
owner = serializers.StringRelatedField(read_only=True)
class Meta:
model = purchaserShippingDetail
fields = '__all__'
Views.py for purchaserShippingDetail 模型
class purchaserShippingDetailsListCreateView(ListCreateAPIView):
serializer_class = purchaserShippingDetailSerializer
queryset = purchaserShippingDetail.objects.all()
编辑:添加了购买者模型表
【问题讨论】:
-
如果 owner 可以为 null 设置
owner = models.OneToOneField(Purchaser, on_delete=models.CASCADE, related_name=purchaser_shipping, blank=True, null=True)否则您可能在发出请求时忘记传递 owner_id(整数)。 -
设置为 null 后,请求被传递,但不是使用提供的名称,例如
Michael,而是使用 null。关于您的第二点,我试图避免传递 owner_id,因为在前端,有人可能不知道所有购买者的所有 owner_id,而是他们想使用购买者的姓名 -
我认为您必须通过 owner_id,这就是一个 purchaseShippingDetail 表识别您的 Purchaser 表的方式。我的意思是主键是 id 不是所有者名称。在您的情况下,您可以将所有者名称设置为 pk 我猜,但它必须是唯一的。 PS:在命名你的类时使用 UpperCamelCase 约定以获得良好的实践。
标签: django api django-models django-rest-framework django-serializer