Bạn có thể thực hiện điều này sử dụng các mối quan hệ chung bằng cách thủ công tạo ra các bảng đường giao nhau giữa thông điệp và người nhận:
from django.db import models
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
class Client(models.Model):
city = models.CharField(max_length=16)
# These aren't required, but they'll allow you do cool stuff
# like "person.sent_messages.all()" to get all messages sent
# by that person, and "person.received_messages.all()" to
# get all messages sent to that person.
# Well...sort of, since "received_messages.all()" will return
# a queryset of "MessageRecipient" instances.
sent_messages = generic.GenericRelation('Message',
content_type_field='sender_content_type',
object_id_field='sender_id'
)
received_messages = generic.GenericRelation('MessageRecipient',
content_type_field='recipient_content_type',
object_id_field='recipient_id'
)
class Meta:
abstract = True
class PersonClient(Client):
first_name = models.CharField(max_length=16)
last_name = models.CharField(max_length=16)
gender = models.CharField(max_length=1)
def __unicode__(self):
return u'%s %s' % (self.last_name, self.first_name)
class CompanyClient(Client):
name = models.CharField(max_length=32)
tax_no = models.PositiveIntegerField()
def __unicode__(self):
return self.name
class Message(models.Model):
sender_content_type = models.ForeignKey(ContentType)
sender_id = models.PositiveIntegerField()
sender = generic.GenericForeignKey('sender_content_type', 'sender_id')
msg_body = models.CharField(max_length=1024)
def __unicode__(self):
return u'%s...' % self.msg_body[:25]
class MessageRecipient(models.Model):
message = models.ForeignKey(Message)
recipient_content_type = models.ForeignKey(ContentType)
recipient_id = models.PositiveIntegerField()
recipient = generic.GenericForeignKey('recipient_content_type', 'recipient_id')
def __unicode__(self):
return u'%s sent to %s' % (self.message, self.recipient)
Bạn muốn sử dụng các mô hình trên như sau:
>>> person1 = PersonClient.objects.create(first_name='Person', last_name='One', gender='M')
>>> person2 = PersonClient.objects.create(first_name='Person', last_name='Two', gender='F')
>>> company = CompanyClient.objects.create(name='FastCompany', tax_no='4220')
>>> company_ct = ContentType.objects.get_for_model(CompanyClient)
>>> person_ct = ContentType.objects.get_for_model(person1) # works for instances too.
# now we create a message:
>>> msg = Message.objects.create(sender_content_type=person_ct, sender_id=person1.pk, msg_body='Hey, did any of you move my cheese?')
# and send it to a coupla recipients:
>>> MessageRecipient.objects.create(message=msg, recipient_content_type=person_ct, recipient_id=person2.pk)
>>> MessageRecipient.objects.create(message=msg, recipient_content_type=company_ct, recipient_id=company.pk)
>>> MessageRecipient.objects.count()
2
Như bạn có thể nhìn thấy , đây là một giải pháp dài dòng hơn (phức tạp?). Tôi có thể giữ nó đơn giản và đi với giải pháp của Prariedogg ở trên.
Chà. Đó là một giải pháp tuyệt vời. Không phải là rất tiết nhưng một mức độ phức tạp hơn Prairiedogg. Cảm ơn rất nhiều –
Trong mô hình 'Client', tôi không hiểu tại sao' MessageRecipient' nằm trong 'received_messages = generic.GenericRelation ('MessageRecipient', ...) '? Nó có phải là 'Thông điệp' không? – user3595632
@ user3595632 'received_messages' là mối quan hệ nhiều-nhiều giữa' Client' và 'Message'. Đó là lý do tại sao nó phải nằm trên 'MessageRecipient', mà mô hình hóa một cách rõ ràng mối quan hệ đó, vì không có' GenericManyToManyField'. Điều đó có ý nghĩa? – elo80ka