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并将其关联到新的Albumjsut,然后再首次保存它。

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 的任何信息,因此它可以获得独立性。

另一种方法是覆盖saveAlbum 的方法并在那里创建新的 Rating 对象,此代码基于Django 文档中的示例:

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 回答