我有以下代码:
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()
答案 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
这可能是一种更简单的方法,但您的相册模型会与您的评分模型相关联。