你可以通过手动创建消息和收件人之间的连接表来使用通用关系来实现此目的:
from django.db import modelsfrom django.contrib.contenttypes import genericfrom django.contrib.contenttypes.models import ContentTypeclass 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 = Trueclass PersonClient(Client): first_name = models.CharField(max_length=16) last_name = models.CharField(max_length=16) gender = models.CharField(max_length=1) def __unipre__(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 __unipre__(self): return self.nameclass 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 __unipre__(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 __unipre__(self): return u'%s sent to %s' % (self.message, self.recipient)你将像这样使用以上模型:
>>> 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
如你所见,这是一个更为冗长(复杂?)的解决方案。我可能会保持简单,并在下面使用Prariedogg的解决方案。



