आप मैन्युअल रूप से संदेश और प्राप्तकर्ता के बीच जंक्शन तालिका बनाने के द्वारा इस सामान्य संबंधों का उपयोग कर लागू कर सकते हैं:
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)
तुम इतनी तरह से ऊपर के मॉडल का उपयोग करेंगे:
>>> 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
आप देख सकते हैं , यह एक बहुत अधिक verbose (जटिल?) समाधान है। मैं शायद इसे सरल रखूंगा और उपरोक्त प्रारिडॉग के समाधान के साथ जाऊंगा।
वाह। यह एक अच्छा समाधान है। बहुत verbose नहीं है लेकिन Prairiedogg की तुलना में एक डिग्री अधिक जटिल है। बहुत बहुत धन्यवाद –
'क्लाइंट 'मॉडल में, मुझे समझ में नहीं आता कि क्यों' MessageRecipient'' rece_messages = जेनेरिक में है।जेनेरिकरेलेशन ('संदेश रेजिएंट', ...) '? क्या इसे 'संदेश' होना चाहिए? – user3595632
@ user3595632 'rece_messages'' ग्राहक 'और' संदेश' के बीच कई से अधिक संबंध है। यही कारण है कि इसे 'MessageRecipient' पर होना चाहिए, जो उस रिश्ते को स्पष्ट रूप से मॉडल करता है, क्योंकि वहां कोई' जेनेरिकमनी टोमनीफिल्ड्स 'नहीं है। क्या इसका कोई मतलब है? – elo80ka