6

モデルに対称関係を作成し、関係にフィールドを追加したいと思います。私はこのブログ(およびこの別のブログ)に出くわし、独自のモデルを作成する手順に従いました。

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

しかし、管理者から関係を作成すると、1つだけが作成されます。問題を理解するのを手伝ってくれませんか。

4

1 に答える 1

1

あなたはこれの半分をDjango管理者に持っていると言います(方法は言いませんが、コードを投稿しない限り機能すると思います):残りのステップは欠落している関係の半分を設定することです。

add_balancetransfer()メソッド( )にブレークポイントを設定すると、ブレークポイントimport pdb; pdb.set_trace()が呼び出されないことがわかると思います。作成されるリレーションの一部は、組み込みのDjango管理者の動作によって実行されます。

要するに、add_balancetransfer()モデルが保存されたときに自分自身を呼び出す必要があるかもしれません。あるいは、より良いのは、欠落している関係のみを追加する別のバージョンです。

これを行う1つの方法は、モデルのメソッドをオーバーライドするsave()ことですが、これは少し壊れやすい場合があります。状況によっては、モデルのpost_saveシグナルに欠落している関係を埋めた方がよい場合があります。

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
    ...
于 2012-08-06T02:24:07.483 に答える