Django保存到ManyToMany字段

时间:2014-02-02 20:13:24

标签: django model crud manytomanyfield

我有一个简单的模型类,包含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()

2 个答案:

答案 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)

因为我真的讨厌冗余,所以这是使用动态模型的另一种解决方案。好处是它更整洁,您不需要获取UserAsset对象,您使用相关的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()