首页 > 解决方案 > 如何为关系模型创建或更新价值

问题描述

我想在 django 的 PortfolioProducts 模型中保存 Portfolio 产品详细信息

我有如下模型:

class Product(models.Model):
    name = models.CharField(max_length=255,null=True, verbose_name ='Name')


class Portfolio(models.Model):
    name = models.CharField(max_length=100, blank=True, null=True, verbose_name ='Name')

class PortfolioProducts(models.Model):

    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE, verbose_name ='Portfolio')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name ='Product')

投资组合形式:

class PortfolioForm(forms.ModelForm):
    class Meta:
        model = Portfolio
        fields = ['name']

我的视图文件:

def edit(request):
    portfolio_form = PortfolioForm

    if request.method=="POST":
        portfolio_id=request.POST.get('portfolio_id')
        portfolio_detail = Portfolio.objects.get(pk=portfolio_id)

        pform = portfolio_form(request.POST, instance=portfolio_detail)
        if pform.is_valid():
            portfolio = pform.save(commit = False)
            portfolio.save()

            products=request.POST.getlist('product_id[]')
            for product in products:
                ppform = PortfolioProducts(product_id=product, portfolio_id=portfolio_id)
                port_product = ppform.save()

我正在尝试保存和更新这样的产品组合,但多次将产品添加到产品组合中。

标签: djangodjango-models

解决方案


好吧,您不需要为更新PortfolioProduct而更新Portofilio。因为即使你更新Portfolio了,它的主键还是和以前一样。所以关系还是一样的。

但是,在您的情况下,如果和对象PortofolioProduct中的产品不存在,那么您可以像这样创建一个:productsPortfolio

 for product in products:
       ppform, _ =  PortfolioProducts.objects.get_or_create(product_id=product, portfolio_id=portfolio_id)

更新

来自评论:您需要def save(self):从模型中删除方法(因为您没有在这些保存方法中做任何特别的事情),或者如果打算保留您save()的方法,那么您需要正确调用超级,如下所示:

class Product(models.Model):
    name = models.CharField(max_length=255,null=True, verbose_name ='Name')

    def save(self, *args, **kwargs):
        super(Product, self).save(*args, **kwargs)

class Portfolio(models.Model):
    name = models.CharField(max_length=100, blank=True, null=True, verbose_name ='Name')

    def save(self, *args, **kwargs):
        super(Portfolio, self).save(*args, **kwargs)

class PortfolioProducts(models.Model):
    portfolio = models.ForeignKey(Portfolio, on_delete=models.CASCADE, verbose_name ='Portfolio')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name ='Product')

    def save(self, *args, **kwargs):
        super(PortfolioProducts, self).save(*args, **kwargs)

推荐阅读