Python 如何在Django';曼尼托曼尼菲尔德在哪里?

Python 如何在Django';曼尼托曼尼菲尔德在哪里?,python,django,django-models,django-admin,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_a

我想在我的模型上创建一个对称关系,并在关系中添加一个字段。我遇到(也遇到)并遵循创建自己模型的步骤

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')

但是当我从admin创建关系时,只创建了一个关系。你能帮我解决这个问题吗?

你说你在Django admin中有一半(你不说如何,但我假设它工作,除非你发布代码):剩下的步骤是设置缺少的一半关系

我怀疑,如果您在
add\u balancetransfer()
方法(
import pdb;pdb.set\u trace()
)中放置断点,您将发现它从未被调用过-创建的关系部分是通过内置的Django管理行为完成的

简而言之,在保存模型时,您可能只需要自己调用
add\u balancetransfer()
,或者,更好的是,调用一个只添加缺少的关系的不同版本

一种方法是,但这可能有点脆弱。对于您的情况,在以下表格中填写缺失的关系可能会更好:


你能不能更详细地解释一下,只有一个被创造出来意味着什么?或者指定您希望发生什么?函数CreditCardIssuer.add\u balancetransfer显示了我从admin创建关系时想要完成的任务。这样,将为两个对象创建关系。谢谢你花时间来解决这个问题。两种关系不会“自动”建立起来——但我不是100%清楚你期望什么样的行为。你能详细说明一下吗?没有魔法,IIRC,你需要调用
balance\u transfer
remove\u balancetransfer
或者显式地执行
get\u或\u create
,例如在的信号处理程序中。为什么不直接对self字段使用
symmetric=True
m2m,让Django为你做对称的工作呢?或者是因为您需要
until
字段?在这种情况下,您如何从admin创建m2m关系?(管理员不会将
symmetric=False
m2m处理为self字段,是吗?)。我已经在这些方法中添加了一些日志记录,并确认它们从未被调用。如果没有自动创建反向关系对象的方法,也许我会选择重写save()方法。@supervacuo看起来像是一个打字错误。您的导入用于后期保存,而您的接收者使用的是前期保存。
from django.db.models.signals import post_save
from django.dispatch import receiver

from yourapp.models import CreditCardIssuer

@receiver(post_save, sender=CreditCardIssuer)
def add_missing_relationship(sender, **kwargs):
    # Add the other side of what should be a symmetrical relationship
    ...