【问题标题】:Django Intermediary model save() issueDjango 中介模型 save() 问题
【发布时间】:2011-11-08 02:00:06
【问题描述】:

这个问题与ab 类似,但略有不同。我是 django 的新手,所以请多多包涵。以下是我的模型

class Project(UniqueIdentifier):
    status = models.CharField(max_length=2)

class User(UniqueIdentifier):
    first_name = models.CharField(max_length=50,blank=False,null=False)
    last_name = models.CharField(max_length=50,blank=False,null=False)
    email_address = models.EmailField(max_length=200)
    user_state = models.BooleanField()

    class Meta:
        abstract = True

class Employee(User):
    experience = models.DecimalField(max_digits=4, decimal_places=2)
    userType = models.CharField(max_length=2,choices=USER_TYPES)

class Team(UniqueIdentifier):
    role = models.CharField(max_length=2)
    members = models.ManyToManyField(Employee, through="TeamMember")
    belongsTo = models.ForeignKey(Project, related_name="team")

class TeamMember(UniqueIdentifier):
    team = models.ForeignKey(Team)
    members = models.ForeignKey(Employee)

在我的通用视图类中

class ProjectView(UpdateView):
    model = Project
    fset = inlineformset_factory(Project,Team,form=TeamForm,can_delete=False,fk_name="belongsTo",extra=0)
    def get_object(self, *args, **kwargs):
        c = get_object_or_404(Project, unique_id = self.kwargs.get('cid'))
        df = ProjectForm(instance=c)
        .......
        return c

    def get_context_data(self, *args, **kwargs):
        context = super(ProjectUpdateView, self).get_context_data(*args, **kwargs) 
        ..........
        return context

    def form_valid(self,form,*args, **kwargs):
        c = get_object_or_404(Project, unique_id = self.kwargs.get('cid'))
        if self.request.method == "POST":
            df = ProjectForm(self.request.POST, instance = c)
            if df.is_valid():
                c = df.save()
                fs = self.fset(self.request.POST,instance=c)
                if fs.is_valid():
                    k=fs.save()

我收到了这个错误。

Cannot set values on a ManyToManyField which specifies an intermediary model.

如果有人有替代解决方案,请提出建议(我真的不想将逻辑溢出到单独的形式中)。感谢您的帮助,谢谢!

** 更新:找到解决方案 here。这是我的解决方案,

Class ProjectView(CreateView):
    .........
    def form_valid():
        .........
        if fs.is_valid():
                    k=fs.save(commit=False)
                    for h in k:
                        h.save()
                    for x in range(0,len(k)):
                        for y in self.request.POST.getlist('team-'+str(x)+'-members'):
                            p=TeamMember(team=k[x],members=get_object_or_404(Employee,unique_id=y))
                            p.save()

非常感谢!

【问题讨论】:

    标签: django cpython


    【解决方案1】:

    如果您包含堆栈跟踪(而不仅仅是错误)会很有帮助。但是从外观上看,您需要保存中间模型的实例:

    引用the docs:

    既然您已经设置了 ManyToManyField 以使用中间模型,那么您就可以开始创建一些多对多关系了。您可以通过创建中间模型的实例来做到这一点......与普通的多对多字段不同,您不能使用添加、创建或赋值来创建关系......创建这种类型关系的唯一方法是创建中间模型的实例。

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 2022-11-05
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      相关资源
      最近更新 更多