Home > Blockchain >  Not able to Update CRUD data with foreign keys despite putting correct namings
Not able to Update CRUD data with foreign keys despite putting correct namings

Time:07-12

I am doing CRUD data which has foreign keys and serializers(since I am told to use serializers instead of Forms),even though I have put the correct model and it's names in the product_edit page, the data is showing blank instead of thier saved data ,the wrong sub_category name is coming,this is how the edit page currently looks enter image description here

serializer:

class CategoriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Categories
        fields = "__all__"
        extra_kwargs = {'category_name': {'required': False}}


class ColorsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Colors
        fields = "__all__"

class POLLSerializer(serializers.ModelSerializer):
    # categories = serializers.StringRelatedField(many=False)
    # sub_categories = serializers.StringRelatedField(many=False)
    # color = serializers.StringRelatedField(many=False)
    # size = serializers.StringRelatedField(many=False)
    class Meta:
        model = Products
        fields = "__all__"


class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Size
        fields = "__all__"


class SUBCategoriesSerializer(serializers.ModelSerializer):
    class Meta:
        model = SUBCategories
        fields = "__all__"



below are the models of my CRUD

class Products(models.Model):
    categories = models.ForeignKey(Categories,on_delete=models.CASCADE)
    sub_categories = models.ForeignKey(SUBCategories,on_delete=models.CASCADE)
    color = models.ForeignKey(Colors,on_delete=models.CASCADE)
    size = models.ForeignKey(Size,on_delete=models.CASCADE)
    # image = models.ImageField(upload_to = 'media/',width_field=None,height_field=None,null=True)
    title = models.CharField(max_length=50)
    price = models.CharField(max_length=10)
    sku_number = models.CharField(max_length=10)
    product_details = models.CharField(max_length=300)
    quantity = models.IntegerField(default=0)
    isactive = models.BooleanField(default=True)
    
class Categories(models.Model):
    #made changes to category_name for null and blank
    category_name = models.CharField(max_length=20)
    category_description = models.CharField(max_length=20)
    isactive = models.BooleanField(default=True)
    
    def __str__(self):
        return self.category_name
class Colors(models.Model):
    color_name = models.CharField(max_length=10)
    color_description = models.CharField(max_length=10)
    isactive = models.BooleanField(default=True)

    def __str__(self):
        return self.color_name
class Size(models.Model):
    size_name = models.CharField(max_length=10)
    size_description = models.CharField(max_length=20)
    isactive = models.BooleanField(default=True)

    def __str__(self):
        return self.size_name
class SUBCategories(models.Model):
    category_name = models.ForeignKey(Categories, on_delete=models.CASCADE)
    sub_categories_name = models.CharField(max_length=20)
    sub_categories_description = models.CharField(max_length=20)
    isactive = models.BooleanField(default=True)

    def __str__(self):
        return self.sub_categories_name

update function

def update(request,id):
    if request.method == 'GET':
        print('GET',id)
        edit_products = SUBCategories.objects.filter(id=id).first()
        s= SUBCategoriesSerializer(edit_products)
        category_dict = Categories.objects.filter(isactive=True)
        category = CategoriesSerializer(category_dict, many=True)
        sub_category_dict = SUBCategories.objects.filter(isactive=True)
        sub_category = SUBCategoriesSerializer(sub_category_dict,many=True)
        color_dict = Colors.objects.filter(isactive=True)
        color = ColorsSerializer(color_dict,many=True)
        size_dict = Size.objects.filter(isactive=True)
        size = SizeSerializer(size_dict,many=True)
        hm = {"context": category.data,"sub_context":sub_category.data,"color_context":color.data,"size_context":size.data,"SUBCategories":s.data}
        return render(request,'polls/product_edit.html',hm)
    else:
        print('POST',id)
        editproducts = {}
        d = Products.objects.filter(id=id).first()
        if d:
            editproducts['categories']=request.POST.get('categories')
            editproducts['sub_categories']=request.POST.get('sub_categories')
            editproducts['color']=request.POST.get('color')
            editproducts['size']=request.POST.get('size')
            editproducts['title']=request.POST.get('title')
            editproducts['price']=request.POST.get('price')
            editproducts['sku_number']=request.POST.get('sku_number')
            editproducts['product_details']=request.POST.get('product_details')
            # print(editsubcategories)
            form = SUBCategoriesSerializer(d,data= editproducts)
            if form.is_valid():
                form.save()
                print("form data",form.data)
                print('form error',form.errors)
                messages.success(request,'Record Updated Successfully...!:)')
                return redirect('polls:show')
            else:
                print(form.errors)
                return redirect("polls:show")

where am I going wrong in the code?

CodePudding user response:

you must create product serializer like below

class ProductSerial(ModelSerializer):
    class Meta:
        model = Products

        fields = '__all__'

and pass editproducts to this serializer

and also you have to be careful that pass id's of

categories
sub_categories
color
size

into request.POST data

  • Related