2015-11-04 72 views
0

我在通過多對多關係與其他模型相關的模型中插入數據。我試圖用加()在許多一對多申請添加值,但不工作,提高此錯誤Cannot set values on a ManyToManyField which specifies an intermediary model.Django中多對多中介的問題

我閱讀文檔,並發現我們不能對中介模型中使用set(), add(), create()

這裏是我的模型:

class Venue(MPTTModel): 
    organisation = models.ForeignKey(Organisation, verbose_name=_('organisation')) 
    name = models.CharField(_('name'), max_length=100) 
    description = models.TextField(_('description'), null=True, blank=True) 
    address = models.ForeignKey(Address, verbose_name=_('address')) 
    org_users = models.ManyToManyField(PortalUser, through='OrgMapping', verbose_name=_('org users')) 
    modified_at = models.DateTimeField(_('modified at'), auto_now=True) 

class OrgMapping(models.Model): 
    host_group = models.ForeignKey(OrgHostGroups, verbose_name=_('host group')) 
    org_user = models.ForeignKey(PortalUser, verbose_name=_('org user')) 
    venue = models.ForeignKey(Venue, verbose_name=_('venue')) 
    org_roles = models.ManyToManyField(OrgRole, verbose_name=_('org roles')) 
    org_permissions = models.ManyToManyField(OrgPermission, verbose_name=_('org permissions'), blank=True) 
    created_at = models.DateTimeField(_('created at'), auto_now_add=True) 
    modified_at = models.DateTimeField(_('modified at'), auto_now=True) 
    is_deleted = models.BooleanField(_('is deleted'), default=False) 



def create_org_venue(org, name, desc, address, org_users): 
    """ 
    org_users must be a list or portal users pk's 
    """ 

    parent = get_or_none(Venue, organisation__name='TeraMatrix') 
    venue = Venue(organisation=org, 
          name=name, 
          description='Head Office', 
          address=address) 
    venue.save() 
    # save org_users to above venue 
    for user in org_users: 
     # venue.org_users.add(user) 
     venue.org_users = get_or_none(PortalUser,pk=user) 
     venue.save() 
    return venue 

現在,如果我會嘗試使用create_org_venue它會提高錯誤會場瞭解創建。任何想法,我怎麼能做到這一點

編輯: -

class OrgHostGroups(MPTTModel): 
    organisation = models.ForeignKey(Organisation, verbose_name=_('organisation')) 
    name = models.CharField(_('name'), max_length=100) 
    description = models.TextField(_('description'), null=True, blank=True) 
    org_users = models.ManyToManyField(PortalUser, through='OrgMapping', verbose_name=_('org users')) 
    venues = models.ManyToManyField(Venue, through='OrgMapping', verbose_name=_('venues')) 

正如你可以看到場館模型通過映射orgmapping並且還需要orghostgroup並再次需要的場地和映射。所以我們可以說這是一種循環關係。

回答

1

當使用中介模型時,不可能使用add(),因爲這不會讓您指定中介模型上額外字段的值。

相反,只需創建一箇中介模型的實例。

OrgMapping.objects.create(
    venue=venue, 
    org_user=user, 
    # set all the other required OrgMapping fields here 
) 

有關更多信息,請參閱extra fields on many-to-many relationships上的文檔。

+0

是的,我發現我需要首先通過映射創建實例。但是我的問題有點複雜。我已編輯我的問題,請你檢查 – saf

+0

對不起,我不確定我瞭解問題。你能不能隨意調用'OrgMapping.objects.create()'多次? – Alasdair