Django - 创建对象和子对象

时间:2013-01-18 15:42:23

标签: django

我有以下代码:

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)

创建对象(Album)及其子对象(Rating)并保存它的最佳方法(在django / python哲学中)是什么?

我做到了:

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

我不喜欢这样,因为创建子对象空的部分完全没用。 我更喜欢这样一个简单的方法 - 应该自动创建子对象:

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

2 个答案:

答案 0 :(得分:3)

您需要查看signals

保存对象时,基本上会发送信号。

使用pre_save信号,您可以创建Rating并将其与新Album jsut相关联,然后再进行首次保存。

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

我没有测试过这个特定的代码,但它应该让你朝着正确的方向前进

答案 1 :(得分:0)

使用信号作为rockingskier说这是一个很好的方法,因为你的专辑对象不需要知道有关评级的任何信息,所以它获得了独立性。

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

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

这可能是一种更简单的方法,但您的相册模型会与您的评分模型相关联。

相关问题