NOT NULL约束失败:stores_store.merchant_id

时间:2016-07-29 03:15:15

标签: python django api python-3.x django-rest-framework

我正在使用djano rest框架来设计商店列表和创建的API。我的应用程序的概念是商家和买家之间的联系。商家可以拥有多个不同类别的商店。我有一个包含商家信息的商家模型,包含某些类别产品列表的商品和包含商店信息的商店。我可以使用API​​列出商店,也可以显示商店创建的表单。但是,在尝试创建新商店时出现以下错误。

/ api / stores / create / NOT NULL约束中的IntegrityError失败:stores_store.merchant_id

my models.py

class Merchant(models.Model):
    user = models.ForeignKey(User)
    phone = models.PositiveIntegerField(null=True,blank=True)

class Store(models.Model):
    merchant = models.ForeignKey(Merchant)
    name_of_legal_entity = models.CharField(max_length=250)

class Product(models.Model):
    store = models.ForeignKey(Store)
    image = models.ForeignKey('ProductImage',blank=True,null=True)
    name_of_product = models.CharField(max_length=120)

class ProductImage(models.Model):
    image = models.ImageField(upload_to='products/images/')

class StoreCategory(models.Model):
    product = models.ForeignKey(Product,null=True, on_delete=models.CASCADE,related_name="store_category")
    store_category = models.CharField(choices=STORE_CATEGORIES, default='GROCERY', max_length=10)

Serializers.py

User = get_user_model()

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ("username","first_name","last_name","email",)

class MerchantSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = Merchant
        fields = ["id","user","phone","address","city",]


class ProductImageSerializer(ModelSerializer):
    class Meta:
        model = ProductImage
        fields  =   ( 'id','imageName','image', )

class ProductSerializers(ModelSerializer):
    image = ProductImageSerializer()
    class Meta:
        model = Product
        fields=('id','image','name_of_product','description','price','active',)

class StoreCategorySerializer(ModelSerializer):
    product = ProductSerializers()
    class Meta:
        model = StoreCategory
        # fields=["id","store_category",]

class StoreSerializer(ModelSerializer):
    # url = HyperlinkedIdentityField(view_name='stores_detail_api')
    store_categories = StoreCategorySerializer(many=True) 
    merchant = MerchantSerializer()
    class Meta:
        model = Store
        fields=("id",
                # "url",
                "merchant",
                "store_categories",
                "name_of_legal_entity",
                "pan_number",
                "registered_office_address",
                "name_of_store",
                "store_contact_number",
                "store_long",
                "store_lat",
                "store_start_time",
                "store_end_time",
                "store_off_day",
                )


class StoreCreateSerializer(ModelSerializer):
    store_categories = StoreCategorySerializer()
    merchant = MerchantSerializer()
    class Meta:
        model = Store
        fields=("id",
                "merchant",
                "store_categories",
                "name_of_legal_entity",
                "pan_number",
                "registered_office_address",
                "name_of_store",
                "store_contact_number",
                "store_long",
                "store_lat",
                "store_start_time",
                "store_end_time",
                "store_off_day",
                )
    def create(self,validated_data):
        store_categories_data = validated_data.pop('store_categories')
        merchant_data = validated_data.pop('merchant')
        store = Store.objects.create(**validated_data)
        for store_categories in store_categories_data:
            store_categories, created = StoreCategory.objects.get_or_create(pan_number=store_categories['pan_number'])
            store.store_categories.add(store_categories)
        for merchant in merchant_data:
            merchant, created = Merchant.objects.get_or_create(user=merchant['user'])
            store.merchant.add(merchant)
        return store

Views.py

class StoreCreateAPIView(CreateAPIView):
    queryset = Store.objects.all()
    serializer_class = StoreCreateSerializer
    parser_classes = (FormParser,MultiPartParser,)

商家对象看起来像这样

 "merchant": {
            "id": 6,
            "username": "sans",
            "first_name": "sans",
            "last_name": "bas",
            "email": "sans@gmail.com"
        },

1 个答案:

答案 0 :(得分:0)

StroreCreateSerializer存在问题。你正试图创建没有商家的商店实例,这就是为什么你会收到错误。如果你想创建没有商家的商店,你需要让商家外键Null tr​​ue。我希望这有帮助。

此外,您正在使用带外键的add()。 add()方法适用于多对多关系。

class StoreCreateSerializer(ModelSerializer):
store_categories = StoreCategorySerializer()
merchant = MerchantSerializer()
class Meta:
    model = Store
    fields=("id",
            "merchant",
            "store_categories",
            "name_of_legal_entity",
            "pan_number",
            "registered_office_address",
            "name_of_store",
            "store_contact_number",
            "store_long",
            "store_lat",
            "store_start_time",
            "store_end_time",
            "store_off_day",
            )
def create(self,validated_data):
    store_categories_data = validated_data.pop('store_categories')
    merchant_data = validated_data.pop('merchant')
    for merchant in merchant_data:
        merchant, created = Merchant.objects.get_or_create(user=merchant['user']['email'], default=merchant['user'])
    validated_data["merchant"] = merchant 
    store = Store.objects.create(**validated_data)
    for store_categories in store_categories_data:
        store_categories, created = StoreCategory.objects.get_or_create(pan_number=store_categories['pan_number'])
        store_categories.product.store = store
        store_categories.save()
    return store

要完成这项工作,您需要JSON应该如下所示:

{
   merchant:{
     "user":{
         "first_name":"ABC",
         "last_name": "xyz",
         "email":"xyz@abc.com"
       }
  }
}