django-reversion и родственная модель

У меня есть следующие модели.py

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 на основе классов, я могу создавать ревизии в любое время, когда создаю новые отношения между двумя контактами.

# 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 можно использовать для создания обеих ревизий?


person TonyEight    schedule 11.10.2013    source источник
comment
Попробуйте зациклиться внутри списка ['от', 'до'] с обратной связью во второй раз.   -  person jcs    schedule 11.10.2013
comment
Вы говорите о сохранении обоих контактов?   -  person TonyEight    schedule 11.10.2013
comment
Я знаю, что эта проблема старая, но вы когда-нибудь решили ее? Вы регистрируете внешние ключи для отслеживания?   -  person tutuDajuju    schedule 25.11.2014
comment
К сожалению, мы отказались от идеи использования Reversion. Мы создали собственную модель LogEntry для регистрации любых изменений. На самом деле нам действительно не нужна была реверсия, так как наше приложение не предоставляет никаких действий по восстановлению. Но да, регистрация внешних ключей должна решить проблему.   -  person TonyEight    schedule 26.11.2014


Ответы (1)


Возможно, немного поздно, но я думаю, что с последней версией реверсии вы можете следить за отношениями:

Добавьте эту строку в конец вашей модели:

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

person acidjunk    schedule 13.11.2015