【问题标题】:having trouble in saving form data into ManyToMany field在将表单数据保存到 ManyToMany 字段时遇到问题
【发布时间】:2019-08-27 11:47:19
【问题描述】:

我的模特是这样的

class Dish(models.Model):
    names = models.ManyToManyField(DishName)
    restaurant = models.ManyToManyField(Restaurant)

我的视图文件就像

  def AddDish(request):
        if request.method == 'POST':
            dishname = request.POST.get('name')
            res = request.POST.get('restaurant')
            restaurant = Restaurant.objects.get(id=res)


            r = Dish(generic_name=GenericName,
                       names=dishname,
                       restaurant=restaurant,
                           )
            r.save()

当我尝试将我的值添加到 Dish 模型时,会出现此错误

禁止直接分配到多对多集合的前端。请改用 restaurant.set()。

我尝试使用 set,但没有像我尝试过 restaurant.set(r) 那样在哪里使用它,但直到现在还没有运气。任何帮助将不胜感激。提前谢谢

【问题讨论】:

    标签: python django python-3.x django-models django-views


    【解决方案1】:
    def AddDish(request):
        if request.method == 'POST':
            dishname = request.POST.get('name')
            res = request.POST.get('restaurant')
            restaurant = Restaurant.objects.get(id=res)
            dn = DishName(name=dishname)
            r = Dish.objects.create()
            r.restaurant.add(restaurant)
            r.names.add(dn)

    但是我相信你应该首先使用ManyToManyField。如果一道菜只属于一个Restaurant,那么你可能应该使用ForeignKey

    你首先需要保存你的Dish之前你可以改变ManyToMany关系,否则你的Dish没有主键分配给它。

    【讨论】:

    • 感谢威廉的回答。其实它已经设计好了。根据我的理解,现在我们会先添加一个餐厅?这不好,
    • @gamer:但是您原始代码中的restaurant 已经 保存了,因为您打算用get 检索它?关键是您要添加关系的两个对象都应该首先存在。
    • 感谢您的回复。餐厅和菜名表都存在,其中包含所有条目。就像我有两张桌子,并且有餐馆和菜名的条目。首先,我检索并显示到 AddDish 的模板中,用户从下拉菜单中选择它们并提交。并且 onSubmit 这个视图有效。所以在这种情况下,我不需要创建新的餐厅和菜名
    • @gamer:不,确实,在这种情况下,您可以简单地从数据库中获取这两者。您还可能需要考虑使用模型表单:这可以为您执行样板逻辑docs.djangoproject.com/en/2.2/topics/forms/modelforms
    • django.db.utils.IntegrityError: NOT NULL 约束失败: MainApp_dish.dish_category_id 。我现在收到此错误
    【解决方案2】:

    如果你想使用.set ==>

    def AddDish(request):
        if request.method == 'POST':
            dishname = request.POST.get('name')
            res_id = request.POST.get('restaurant')
            restaurant = Restaurant.objects.get(id=res_id)
            dn = DishName.objects.get(name=dishname)
            dish = Dish.objects.create(generic_name=GenericName)
            dish.names.set([dn])
            dish.restaurant.set([restaurant])
            dish.save()
    

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 2014-06-06
      • 2021-12-31
      • 1970-01-01
      • 2020-11-14
      • 2021-09-18
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多