【发布时间】:2012-08-03 03:51:36
【问题描述】:
我想在我的模型上创建一个对称关系,并在关系中添加一个字段。我遇到了this blog(还有this another blog)并按照步骤创建了我自己的模型。
class CreditCardIssuer(models.Model):
name = models.CharField(_('name'), max_length=256)
transfer_limits = models.ManyToManyField('self', through='Balancetransfer', related_name='no_transfer_allowed+', symmetrical=False, help_text=_('List of issuers to which balance transfer is not allowed.'))
def add_balancetransfer(self, creditcardissuer, until):
balance_transfer, _newly_created = Balancetransfer.objects.get_or_create(
no_transfer_from=self,
no_transfer_to=creditcardissuer,
until=until)
balance_transfer, _newly_created = Balancetransfer.objects.get_or_create(
no_transfer_from=creditcardissuer,
no_transfer_to=self,
until=until)
return balance_transfer
def remove_balancetransfer(self, creditcardissuer, until):
Balancetransfer.objects.filter(
no_transfer_from=self,
no_transfer_to=creditcardissuer,
until=until).delete()
Balancetransfer.objects.filter(
no_transfer_from=self,
no_transfer_to=creditcardissuer,
until=until).delete()
return
def get_transfer_limits(self, until):
return self.transfer_limits.filter(
no_transfer_to__until=until,
no_transfer_to__no_transfer_from=self)
class Balancetransfer(models.Model):
no_transfer_from = models.ForeignKey('CreditCardIssuer', related_name='no_transfer_from')
no_transfer_to = models.ForeignKey('CreditCardIssuer', related_name='no_transfer_to')
until = models.IntegerField(blank=True, null=True, help_text='Minimum card ownership period to allow balance transfer.')
class Meta:
unique_together = ('no_transfer_from', 'no_transfer_to')
但是当我从管理员创建关系时,只创建了一个。你能帮我解决问题吗?
【问题讨论】:
-
您能否详细说明一下您对only one is created 的含义?或者指定您期望发生的事情?
-
函数 CreditCardIssuer.add_balancetransfer 显示了我从管理员创建关系时想要完成的任务。这样,将为两个对象创建关系。感谢您花时间解决它。
-
不会“自动”创建两个关系——我不是 100% 清楚你所期望的行为。你能详细说明一下吗?
-
没有魔法,IIRC,你需要调用
balance_transfer和remove_balancetransfer或者明确地做get_or_create,例如在m2m_changed的信号处理程序中。 -
为什么不直接使用
symmetric=Truem2m-to-self 字段,让 Django 为您完成对称工作?还是因为您想要until字段?在这种情况下,您如何从管理员创建 m2m 关系? (管理员不会处理symmetric=Falsem2m-to-self 字段,对吗?)
标签: python django django-models django-admin