1

マルチテーブル継承を通じてライブラリモデルを拡張しようとしていますが、これが最終的な結果です:

class CompetitionMedia(InstagramMedia):
    visible = models.BooleanField(default=True)
    most_creative = models.BooleanField(default=False)

@receiver(post_save, sender=InstagramMedia, dispatch_uid='create_competition_media')
def create_competition_media(sender, instance, created, **kwargs):
    competition_media = CompetitionMedia()
    competition_media.instagrammedia = instance
    competition_media.save() # fails

@receiver(post_save, sender=InstagramMedia, dispatch_uid='create_competition_media2')
def create_competition_media2(sender, instance, created, **kwargs):
    CompetitionMedia.objects.create(instagrammedia=instance) # Fails

これを行うことは可能ですか?

4

2 に答える 2

1

私が理解しているように、あなたはこのようなものを手に入れたいと思っています:

class CompetitionMedia(models.Model):
    instagrammedia = models.OneToOneField(InstagramMedia, primary_key=True)
    visible = models.BooleanField(default=True)
    most_creative = models.BooleanField(default=False)

@receiver(post_save, sender=InstagramMedia, dispatch_uid='create_competition_media2')
def create_competition_media(sender, instance, created, **kwargs):
    if created:  
         CompetitionMedia.objects.create(instagrammedia=instance)
于 2012-09-10T12:51:29.347 に答える
0

私は明らかにparent_ptr次のように設定することになっています:

@receiver(post_save, sender=InstagramMedia, dispatch_uid='create_competition_media')
def create_competition_media2(sender, instance, created, **kwargs):
    if created:
        CompetitionMedia.objects.create(instagrammedia_ptr=instance)

ただし、最初に親を作成して保存してから子を作成しようとすると、子に設定していないフィールドでも子が親をオーバーライドするという問題があります。https://code.djangoproject.com/ticket/11618およびhttps://code.djangoproject.com/ticket/7623で説明されているように、それが起こることがあまり明白ではないという理由だけで避けます。

誰かが本当にそのルートをたどりたい場合は、次のことを行う必要があります。

@receiver(post_save, sender=InstagramMedia, dispatch_uid='create_competition_media')
def create_competition_media2(sender, instance, created, **kwargs):
    if created:
        CompetitionMedia.objects.create(instagrammedia_ptr=instance)
        instance.save() # This should re-save the parent values.

さらに良いことに:

@receiver(post_save, sender=InstagramMedia, dispatch_uid='create_competition_media')
def create_competition_media2(sender, instance, created, **kwargs):
    if created:
        CompetitionMedia.objects.create(instagrammedia_ptr=instance,
            **instance.__dict__)
于 2012-09-10T17:10:25.413 に答える