在模型中定义属性,如Django中其他模型的对象

时间:2009-10-25 19:27:24

标签: django django-models

是否可以在数据模型中定义属性,如Django中其他数据模型的对象? 这是风景:

models.py

class Inmueble(models.Model):
    calle = models.CharField(max_length=20, verbose_name="Calle")
    numero = models.CharField(max_length=6, verbose_name="Numero")
    piso = models.IntegerField(verbose_name="Piso", blank=True, null=True)
    galeria_id = models.OneToOneField(Galeria, verbose_name="Galería del Inmueble")


class Galeria(Gallery):
    nombre = models.CharField(max_length=30, verbose_name="Nombre")

重点是:每次创建Inmueble对象时,我都需要自动创建一个新的Galeria对象。提前谢谢!

                                 Analía.

3 个答案:

答案 0 :(得分:1)

有两种方法可以解决这个问题:

  1. 覆盖Inmueble模型的save()方法。
  2. 在Galeria上创建一个信号处理程序,接收Inmueble发出的信号
  3. 这两种方法都可行且可以接受,但我建议使用信号有几个原因:

    • 它有点脱离耦合。如果以后更改或删除Galeria,则代码不会中断
    • postave的信号处理程序包含一个布尔值,用于指示是否正在创建模型。您可以通过检查模型是否设置了.id来技术上在模型save()中实现相同的功能,但IMO信号是一个更清洁的解决方案。

    以下是这两个代码的概念......

    使用信号(推荐)

    from django.db.models.signals import post_save
    from wherever.models import Inmueble
    
    class Galeria(Gallery):
        # ...
    
    def inmueble_postsave(sender, instance, created, **kwargs):
        if created:
            instance.galeria_id = Galeria.objects.create()
            instance.save()
    
    post_save.connect(inmueble_postsave, sender=Inmueble, dispatch_uid='galeria.inmueble_postsave')
    

    覆盖模型save()方法

    from wherever.models import Galeria
    
    class Inmueble(models.Model):
    
        # ...
    
        def save(self, force_insert=False, force_update=False):
            # No Id = newly created model
            if not self.id:
                self.galeria_id = Galeria.objects.create()
                super(Inmueble, self).save()
    

答案 1 :(得分:0)

也许 AutoOneToOneField就是答案。

答案 2 :(得分:0)

最后,我做了:

from django.db.models.signals import post_save

class Galeria(Gallery):

  inmueble_id = models.ForeignKey(Inmueble)

  def inmueble_postsave(sender, instance, created, **kwargs):
    if created:
        instance = Galeria.objects.create(inmueble_id=instance,     title=instance.calle+' '+instance.numero, title_slug=instance.calle+' '+instance.numero)     
        instance.save()

  post_save.connect(inmueble_postsave, sender=Inmueble,  dispatch_uid='galeria.inmueble_postsave')