我正在使用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"
},
答案 0 :(得分:0)
StroreCreateSerializer存在问题。你正试图创建没有商家的商店实例,这就是为什么你会收到错误。如果你想创建没有商家的商店,你需要让商家外键Null true。我希望这有帮助。
此外,您正在使用带外键的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"
}
}
}