con*_*onf 19 python django django-orm m2m
我是Django的新手,没有找到关于这个问题的任何参考.当我在django模型(models.py)中使用多对多字段时,我收到此错误.我想问题是从窗体(forms.py)中查看视图(views.py)中的m2m.如何在视图中分配m2m字段.
Django版本2.O python 3.5
models.py
class User(AbstractUser):
username=models.CharField(max_length=20)
email = models.EmailField(_('email address'), unique=True)
class Setupuser(models.Model):
organization=models.CharField(max_length=200,blank=False,null=True)
emails_for_help = models.ManyToManyField(User)
Run Code Online (Sandbox Code Playgroud)
views.py
class Set_user(FormView):
template_name="pkm_templates/set_up_user.html"
form_class = Set_User_Form
success_url = '/thanks/'
def form_valid(self, form):
org = form.cleaned_data.get('organization')
emails = form.cleaned_data.get("emails_for_help")
instance = Setupuser(organization=org,emails_for_help=emails)
instance.save()
return redirect("/")
Run Code Online (Sandbox Code Playgroud)
forms.py
class Set_User_Form(ModelForm):
emails_for_help =
forms.ModelMultipleChoiceField(queryset=User.objects.all(),
widget=forms.CheckboxSelectMultiple)
class Meta:
model=Setupuser
fields=["organization","emails_for_help"]
Run Code Online (Sandbox Code Playgroud)
MD.*_*sar 26
您需要获取该User
对象,然后将其添加到emails_for_help
字段中.ManyToManyField
创建实例时无法添加对象.看一下doc.
class Set_user(FormView):
template_name="pkm_templates/set_up_user.html"
form_class = Set_User_Form
success_url = '/thanks/'
def form_valid(self, form):
org = form.cleaned_data.get('organization')
emails = form.cleaned_data.get("share_email_with")
users = User.objects.filter(email__in=emails)
instance = Setupuser.objects.create(organization=org)
for user in users:
instance.emails_for_help.add(user)
return redirect("/")
Run Code Online (Sandbox Code Playgroud)
编辑
另一种方法是使用.set()
.
class Set_user(FormView):
template_name="pkm_templates/set_up_user.html"
form_class = Set_User_Form
success_url = '/thanks/'
def form_valid(self, form):
org = form.cleaned_data.get('organization')
emails = form.cleaned_data.get("share_email_with")
users = User.objects.filter(email__in=emails)
instance = Setupuser.objects.create(organization=org)
instance.emails_for_help.set(users)
return redirect("/")
Run Code Online (Sandbox Code Playgroud)
或者您可以简单地使用.add()
添加任意数量的对象.
class Set_user(FormView):
template_name="pkm_templates/set_up_user.html"
form_class = Set_User_Form
success_url = '/thanks/'
def form_valid(self, form):
org = form.cleaned_data.get('organization')
emails = form.cleaned_data.get("share_email_with")
users = User.objects.filter(email__in=emails)
instance = Setupuser.objects.create(organization=org)
instance.emails_for_help.add(*users)
return redirect("/")
Run Code Online (Sandbox Code Playgroud)
我尝试了上述所有解决方案,但在 Django 3.0 上不起作用。所以,我做了我自己的研究并提出了解决方案。解决方案将非常简单。我的回答是一般。假设存在一个specialFieldName
定义为 a ManyToManyField
in的表单域models.py
。
用户通过“django 表单”输入的此字段的选项存储为Queryset。在这种情况下,我们根本无法ManyToManyField
在基于此查询集创建对象期间将此查询集分配给属性。这就是您收到上述错误的原因。
因此,我们首先根据从 django-form 中获得的所有信息创建对象specialFieldName
,然后我们使用 add() 方法将这个查询集的所有元素添加到我们刚刚创建的对象中。
所以,我们需要迭代这个查询集。
returnedQueryset = form.cleaned_data.get('specialFieldName')
dummyObject = ObjectModel.objects.create(..using all the info except specialFieldname..)
for member in returnedQueryset:
dummyObject.add(member)
Run Code Online (Sandbox Code Playgroud)
不幸的是,循环不会遍历返回查询集的所有成员(阅读为什么?)。因此,上述事情不起作用。我们必须更高级一点,并改用 iterator() 方法。
for member in returnedQueryset.iterator():
dummyObject.add(member)
Run Code Online (Sandbox Code Playgroud)
现在它工作正常。
(PS 这是我在 Stackoverflow 上的第一个回答。感谢我所有的导师 ;-))
归档时间: |
|
查看次数: |
20615 次 |
最近记录: |