2013-10-11 92 views
18

我有以下models.pyDjango的迴歸和相關模型

class Contact(models.Model): 
    pass 

class Link(models.Model): 
    pass 

class Relationship(models.Model): 
    # Documentation 
    __doc__ = _(u'Stores a relationship between 2 contacts.') 
    # Attributes 
    from_contact = models.ForeignKey(Contact, related_name='from_contacts', verbose_name=_(u'first contact'), help_text=_(u'The first contact implicated by the relationship.')) 
    link = models.ForeignKey(Link, related_name=u'relationships', verbose_name=_(u'relationship link'), help_text=_(u'The relationship link between both contacts.')) 
    to_contact = models.ForeignKey(Contact, related_name='to_contacts', verbose_name=_(u'second contact'), help_text=_(u'The second contact implicated by the relationship.')) 

    # Meta-data 
    class Meta: 
     verbose_name = u'Relationship' 
     verbose_name_plural = u'Relationships' 
     unique_together = ('from_contact', 'link', 'to_contact') 

使用Django的基於類的視圖和Revision Context Manager,我可以創造修訂隨時創建2個觸點之間的新關係

# part of my views.py 
class RelationshipCreateView(LoginRequiredMixin, CreateView): 
    template_name = u'frontend/relationships/relationship-create.html' 
    model = Relationship 
    form_class = RelationshipForm 

    def get_success_url(self): 
     return reverse_lazy('contact-detail', kwargs={'contact_pk': self.kwargs['contact_pk']}) 

    def form_valid(self, form): 
     contact = Contact.objects.get(pk=self.kwargs['contact_pk']) 
     link = form.cleaned_data['link'] 
     other = form.cleaned_data['other'] 
     inverse = form.cleaned_data['inverse_relationship'] 
     relationship = None 
     if not inverse: 
      relationship = Relationship(
       from_contact=contact, 
       link=link, 
       to_contact=other 
      ) 
     else: 
      relationship = Relationship(
       from_contact=other, 
       link=link, 
       to_contact=contact 
      ) 
     with reversion.create_revision(): 
      relationship.save() 
      reversion.set_comment(_(u'A relationship has been added between %(from)s and %(to)s' % {'from': relationship.from_contact, 'to': relationship.to_contact})) 
     return HttpResponseRedirect(self.get_success_url()) 

但是隻有其中一個聯繫人獲得修訂版(第一個)以及隨附的評論。如何使用Revision Context Manager來創建兩個修訂版本?

+0

嘗試循環內一個列表['從','到'],第二次是反向關係。 – jcs

+0

你說的是保存兩個聯繫人? – TonyEight

+1

我知道這個問題很老,但你有沒有解決這個問題?你[註冊外鍵要遵循](http://django-reversion.readthedocs.org/en/latest/api.html#advanced-model-registration)? – tutuDajuju

回答

5

可能有點晚了,但我想用最新版本的回覆,你可以遵循關係:

此行添加到模型的結尾:

reversion.register(Relationship, follow=['from_contact', 'link', 'to_contact'])

-1

Django Model Utils是追蹤模型和模型領域的變化以及做很多其他非常酷的東西的新的最佳實踐方式。

+0

如果您參考了[FieldTracker](https://django-model-utils.readthedocs.org/en/latest/utilities.html#field-tracker),那麼:bravo!正是我們當時需要的! Thanx,無論如何:) – TonyEight

+0

的確是這樣!方便:) – TimmyGee

+0

這不是對這個問題的回答。 – acidjunk