Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Django- Como mapear mensagens enviadas entre usuários


O problema com o related_name é que ele deve ser uma string, assim:
sender_id = models.ForeignKey(User, related_name= 'invites_sent', on_delete = models.CASCADE )
recipient_id = models.ForeignKey(User, related_name= 'invites_received', on_delete = models.CASCADE)

isso resolve seu problema de conseguir os convites dos usuários, pois é para isso que serve um nome relacionado. supondo que você tenha um usuário instanciado como esse usuário, você pode obter todos os convites que ele enviou fazendo:
invites = thisuser.invites_sent.all()

ou todos os convites que recebeu fazendo:
invites = thisuser.invites_received.all()

Talvez haja um propósito que eu não conheça, já que sou bastante novo em tudo isso, mas não vejo o ponto no concert_id e o artist_id field, já que ambos são auto_field's e sempre terão o mesmo valor, que também será o mesmo valor do id campo que, como você apontou, o django cria automaticamente (quando você não tem outro campo definido como chave primária para o modelo).

O que eu faria é o seguinte. Defina o convite como tal:
class Invite(models.Model):
    sender = models.ForeignKey(User, related_name= 'invites_sent', on_delete = models.CASCADE )
    recipient = models.ForeignKey(User, related_name= 'invites_received', on_delete = models.CASCADE)
    message = models.CharField(max_length = 120, blank = True, null = True)
    date_sent = models.DateTimeField(auto_now_add = True, auto_now = False)

então você pode criar novos convites como este:
from appname.models import User, Invite

inviter = User.objects.get(id=57) #enter whatever id is the inviter's id
invitee = User.objects.get(id=42) #enter id of person that is being invited
new_invite = Invite(sender=inviter, recipient=invitee, message='Hello, you are invited')
new_invite.save()

e receba convites de usuários como este:
from appname.models import User, Invite

thisuser = User.objects.get(id=42)
invites_sent_by_user = thisuser.invites_sent.all()
invites_received_by_user = thisuser.invites_received.all()
invites_received_after_march_seventh= thisuser.invites_received.filter(date_sent__gt='2015-03-07')

Como você pode acessar os convites por meio do nome_relacionado especificado na declaração de chave estrangeira, o campo manytomanyfield no modelo de usuário não serve para nada.

Espero ter coberto quase tudo

(pode haver erros de digitação, pois digitei todo o código aqui)