在我的 django 应用程序中,发生了一些奇怪的事情,我不明白。
我有两个不同的表(employeeProfile和purchaserShippingDetail),每个表都有一个具有关系
OneToOneField
的字段,但第一个表(employeeProfile)在使用OneToOneField的字段user中,我可以传递字符串表示形式说 Michael 使用 api & 我没有收到错误,但在我的第二个表中,当我向我添加字符串表示时,它具有类似的结构
/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 用于购买者ShippingDetail 模型
class purchaserShippingDetailsListCreateView(ListCreateAPIView):
serializer_class = purchaserShippingDetailSerializer
queryset = purchaserShippingDetail.objects.all()
编辑:添加了购买者模型表
Purchaser
模型吗?有一个引用字段
owner_id
我们在您的帖子中看不到,这将解释更多。您是否在最近的迁移中添加了所有者字段?可能是您向包含现有行的表添加了一个不可为空的字段,导致这些行无法满足不可为空的条件。
您无法在 OneToOneField 上添加默认值,因此在这种情况下,您必须首先将该字段添加为
null=True
。 然后创建一个空的迁移文件来实例化该表上的所有行,以便没有行具有空值。通常您可以通过
manage.py makemigrations app_name --empty
来完成此操作。该文件可能看起来像这样
from django.db import migrations
def instantiate_owner(apps, schema_editor):
purchaserShippingDetail = apps.get_model("appname", "purchaserShippingDetail")
Purchaser = apps.get_model("some_other_app", "Purchaser")
for detail in purchaserShippingDetail.objects.all():
owner = Purchaser.objects.get(some_unique_criteria=detail.unique_criteria)
detail.owner = owner
detail.save()
class Migration(migrations.Migration):
dependencies = [
...,
]
operations = [
migrations.RunPython(instantiate_owner),
]
完成后,您可以删除模型中的 null=True
并进行另一次迁移。
class purchaserShippingDetailsListCreateView(ListCreateAPIView):
serializer_class = purchaserShippingDetailSerializer
queryset = purchaserShippingDetail.objects.all()
def perform_create(self, serializer):
serializer.save(user=self.request.user)