2

次のコードがあります。

class Album(models.Model):
  name = models.CharField(max_length=255, unique=True, null=False)
  rating = models.ForeignKey("Rating", null=False)

class Rating(models.Model):
  value = models.IntegerField(null=False, default=0)

オブジェクト(アルバム)を作成し、それをサブオブジェクト(評価)にして保存する最良の方法(django/python哲学)は何ですか?

私はこれをしました:

a = Album()
a.name = "..."
r = Rating()
r.save()
a.rating = r
a.save()

サブオブジェクトを空にする部分はまったく役に立たないので、私はこれが好きではありません。私はこのような簡単な方法を好むでしょう - サブオブジェクトは自動的に作成されるべきです:

a = Album()
a.name = "..."
a.save()
4

2 に答える 2

3

を調べてみてくださいsignals

基本的に、オブジェクトが保存されるとシグナルが送信されます。

初めて保存する前に、pre_saveシグナルを使用してを作成Ratingし、新しい jsut に関連付けることができます。Album

from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Album, Rating

@receiver(pre_save, sender=Album)
def add_rating_to_album(sender, **kwargs):

    # If saving a new Album
    if not instance.id:

        # Create and save a new rating
        rating = Rating()
        rating.save()

        # Associate it to the Album being saved
        instance.rating = rating

    # Continue to normal save with new rating applied

この特定のコードをテストしていませんが、正しい方向に進むはずです

于 2013-01-18T15:51:43.340 に答える
0

rockingskierが言ったようにシグナルを使用することは、アルバムオブジェクトが評価について何も知る必要がないため、独立性を獲得するため、それを行うための優れた方法です。

これを行う別の方法は、Albumのメソッドをオーバーライドし、そこに新しいRatingオブジェクトを作成することです。このコードは、 Djangoドキュメントsaveの例に基づいています。

class Album(models.Model):
    name = models.CharField(max_length=100)

def save(self, *args, **kwargs):
    # do something here
    super(Album, self).save(*args, **kwargs) # Call the "real" save() method.
    # do anything else

これはより簡単な方法かもしれませんが、アルバムモデルは評価モデルに関連付けられます。

于 2013-01-18T16:13:20.743 に答える