栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

通用的多对多关系

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通用的多对多关系

你可以通过手动创建消息和收件人之间的连接表来使用通用关系来实现此目的:

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的解决方案。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/411212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号