Django:IntegrityError null 值违反了非空约束

问题描述 投票:0回答:2

在我的 django 应用程序中,发生了一些奇怪的事情,我不明白。

我有两个不同的表(employeeProfilepurchaserShippingDetail),每个表都有一个具有关系

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()

编辑:添加了购买者模型表

django api django-models django-rest-framework django-serializer
2个回答
0
投票
您可以也发布

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

 并进行另一次迁移。


0
投票
class purchaserShippingDetailsListCreateView(ListCreateAPIView): serializer_class = purchaserShippingDetailSerializer queryset = purchaserShippingDetail.objects.all() def perform_create(self, serializer): serializer.save(user=self.request.user)
    
© www.soinside.com 2019 - 2024. All rights reserved.