我有一个简单的模型类,包含2个ManyToManyField字段,如下所示:
models.py
class Folder(models.Model):
user = models.ManyToManyField(User)
asset = models.ManyToManyField(Asset)
在我看来,我知道用户ID和资产ID。假设用户ID为1且资产ID为30,如何注入此行?我想我不明白如何实例化文件夹,所以我可以保存/更新行。
views.py
def addAssetToMyFolder(request, id=None):
''' view is simplified for brevity
'''
f = Folder(
user = 1,
asset = 30,
)
f.save()
答案 0 :(得分:2)
要将用户或资产实例与首先保存文件夹所需的文件夹相关联。
为了存储多对多的关系,数据库会创建第三个表来存储对象的ID。
因此,如果您希望将用户与文件夹关联为多对多关系,那么他们都应该拥有自己的ID,然后才能将其关联到多少个。
假设您有两个用户分别拥有ID 10和19。 您有一个ID为4且用户10和用户19的文件夹与此文件夹相关。在数据库级别,这将如何存储这些关系
folder_id user_id
4 10
4 19
因此,对于每个多对多关系,两个模型的关系表中都有一行。
同样对资产有效。
所以代码应该改为:
def addAssetToMyFolder(request, id=None):
''' view is simplified for brevity
'''
f = Folder()
f.save()
user = User.objects.get(id=1) # not needed if adding by id
f.user.add(user) # or f.user.add(user_id)
asset = Asset.objects.get(id=30) # not needed if adding by id
f.asset.add(asset) # or f.asset.add(asset_id)
结帐:https://docs.djangoproject.com/en/1.6/topics/db/examples/many_to_many/
答案 1 :(得分:1)
因为我真的讨厌冗余,所以这是使用动态模型的另一种解决方案。好处是它更整洁,您不需要获取User
和Asset
对象,您使用相关的PK并且您只保存一次。
缺点是,对于日常的普通需求来说,这是一种迟钝的矫枉过正。所以你应该把@ zaphod100.10的答案标记为正确,但要知道这个方法也存在:
Meta = type('Meta', (), {'model': Folder, 'fields': ['user', 'asset']} )
FolderForm = type('FolderForm', (forms.ModelForm, ), {'Meta': Meta})
data = {'user': ['1'], 'asset': ['30']} #the values need to be a list of strings, representing pks of related objects
f = FolderForm(data)
new_obj = f.save()