python多对多word模板_python-通用的多对多关系

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

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

如您所见,这是一个更为冗长(复杂?)的解决方案。 我可能会保持简单,然后使用上面的Prariedogg的解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值