如何创建或更新关系模型的值

时间:2019-05-02 07:02:31

标签: django django-models

我想在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()

我试图像这样保存和更新产品组合产品,但是要多次向产品组合添加产品。

2 个答案:

答案 0 :(得分:1)

好吧,您不需要更新PortfolioProduct就可以更新Portofilio。因为即使更新Portfolio,其主键仍与以前相同。因此,关系保持不变。

但是,在您的情况下,如果PortofolioProductproducts对象中的产品不存在Portfolio,则可以这样创建:

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

更新

从评论中:您需要从模型中删除def save(self):个方法(因为在这些保存方法中没有做任何特别的事情),或者打算保留{{1} }方法,那么您需要像这样正确地调用上级:

save()

答案 1 :(得分:0)

是的,我在django项目中也遇到了同样的问题。在我的案例中,它所做的事情是每次用户尝试更新其个人资料时,它都会创建一个新的个人资料,这是因为它具有外键。我通过在用户每次更新时删除以前的用户个人资料(在您的情况下为投资组合)来解决此问题。

class UserEdit(TemplateView):
template_name = 'accounts/homee.html'

def get(self, request):
    form = UserProfilee()
    ppp = UserProfile.objects.get(user=request.user)
    return render(request, self.template_name, {'form': form, 'ppp': ppp})

def post(self, request):
    form = UserProfilee(request.POST, request.FILES)
    pppp = UserProfile.objects.get(user=request.user)
    if form.is_valid():
        post = form.save(commit=False)
        post.user = request.user
        if not post.image:
            post.image = pppp.image
        UserProfile.objects.filter(user=post.user).delete()
        post.save()
        return redirect('/home/homepage/')

    args = {'form': form}
    return render(request, self.template_name, args)

如您所见,每当用户更新其个人资料时,我都会过滤用户并删除用户个人资料,从而仅留下1个用户个人资料。