Всем привет! Возник вопрос, как лучше организовать models.py для следующего функционала: есть модель Offer:

title = models.CharField(verbose_name=_('title'), max_length=70)
body = models.TextField(verbose_name=_('body'))
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) # тот, кто разместил Offer
category = models.CharField(
     verbose_name=_('category')
     choices=CATEGORY, max_length=30
)

К ней надо прикрутить функционал сделки, когда один юзер шлет запрос на оффер, хозяин оффера соглашается или отказывает, если соглашается, то после совершения услуги, оба должны подтвердить, что они свои дела закончили, а также должны написать друг другу отзыв.

Сейчас я создала две модели DealRequest и Deal:

class Deal(TimeStampedModel):
offer = models.ForeignKey(Offer)
from_user = models.ForeignKey(
    settings.AUTH_USER_MODEL, related_name='user_wants_service'
)
to_user = models.ForeignKey(
    settings.AUTH_USER_MODEL, related_name='user_offers_offer'
)  # А надо ли? Если юзер привязан к офферу?
from_user_confirm = models.BooleanField()
to_user_confirm = models.BooleanField()
from_user_reference = models.BooleanField()  # Или надо FK на референс?
to_user_reference = models.BooleanField()

и

class DealRequest(TimeStampedModel):
offer = models.ForeignKey(Offer)
from_user = models.ForeignKey(
    settings.AUTH_USER_MODEL, related_name='user_wants_service'
)
to_user = models.ForeignKey(
    settings.AUTH_USER_MODEL, related_name='user_offers_offer'
)  # А надо ли? Если юзер привязан к офферу?

message = models.TextField(_('Message'), blank=True)

rejected = models.DateTimeField(blank=True, null=True)
viewed = models.DateTimeField(blank=True, null=True)

class Meta:
    verbose_name = _('Offer Request')
    verbose_name_plural = _('Offer Requests')
    unique_together = ('from_user', 'to_user')

def __str__(self):
    return "%s awaiting acceptance %s" % (self.from_user.username, self.to_user.username)

def accept(self):
    """ Accept this offer request """
    deal = Deal.objects.create(
        from_user=self.from_user,
        to_user=self.to_user
    )

    self.delete()
    return True

def reject(self):
    """ reject this offer request """
    self.rejected = timezone.now()
    self.save()

def cancel(self):
    """ cancel this offer request """
    self.delete()
    return True

def mark_viewed(self):
    self.viewed = timezone.now()
    self.save()
    return True

Соответственно возникли вопросы:

1) Надо ли ссылаться FK на пользователя, который предлагает услугу, если к Offer уже привязан пользователь?

2) Отзыв - лучше Boolean или FK на модель Reference? Уже склоняюсь к Reference

3) Может, как-то можно грамотнее это организовать?

4) Можно ли обойтись без сигналов? (а то я пока в них не разбиралась еще)