如何在Django的ManyToManyField上自动创建对称对象?

Noe*_*oel 6 python django django-models django-admin

我想在我的模型上创建对称关系,并在关系中添加一个字段.我遇到了这个博客(以及另一个博客),并按照创建自己的模型的步骤.

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')
Run Code Online (Sandbox Code Playgroud)

但是当我从管理员创建关系时,只创建一个.你能帮我解决一下这个问题吗?

sup*_*cuo 1

你说你已经在 Django 管理中得到了一半(你没有说如何,但我假设它可以工作,除非你发布代码):剩下的步骤是设置一半缺失的关系。

\n\n

我怀疑如果你在add_balancetransfer()方法 ( import pdb; pdb.set_trace()) 中放置一个断点,你会发现它永远不会被调用 \xe2\x80\x94 创建的关系部分是通过内置的 Django 管理行为完成的。

\n\n

简而言之,您可能只需要add_balancetransfer()在模型保存时调用自己 \xe2\x80\x94 ,或者更好的是,使用仅添加缺失关系的不同版本。

\n\n

实现此目的的一种方法是重写模型的save()方法,但这可能有点脆弱。对于您的情况,填充模型post_save信号中缺失的关系可能会更好:

\n\n
from django.db.models.signals import post_save\nfrom django.dispatch import receiver\n\nfrom yourapp.models import CreditCardIssuer\n\n@receiver(post_save, sender=CreditCardIssuer)\ndef add_missing_relationship(sender, **kwargs):\n    # Add the other side of what should be a symmetrical relationship\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n