【问题标题】:Passing Instance before create, in a ForeignKeyField, Django在创建之前传递实例,在 ForeignKeyField,Django
【发布时间】:2017-08-20 05:37:23
【问题描述】:

我有两种形式的模型:

class Parent(models.Model):
   ....

class Children(models.Model):
   parent = ForeignKey('Parent')
   ....

创建孩子时,我必须将父母作为父母传递,我的问题是我想自己创建孩子,当我创建父母时,就像其他字段一样,比如简单的“models.TextField” 任何人都可以引导我怎么做?

【问题讨论】:

  • 你不能。只需先创建父级,然后添加子级。

标签: django django-models foreign-keys


【解决方案1】:

覆盖Children 模型的__init__() 方法并覆盖Parent 模型的save() 方法:

__init__:

# in class Children()
def __init__(self, parentID):
    self.parent = parentID
    # ...

保存:

# in class Parent()
def save(self, ...):
    # do parent save
    # do parent super().save()

    # PSEUDO CODE # 
    if hasChildren:
        for each childen of parent:
            child = Children(self.id) # <-- entails to overwrite the __init__() method in class Children
            child.save()

此外,您需要呈现选项(子字段)以与父项一起创建子项。

如果您仅为此使用 django-admin 界面,则可以向您添加内联模型 parent smodelAdmin`。见django docs

【讨论】:

    【解决方案2】:

    为您的Parent 模型的保存方法添加一个保存后挂钩。

    from django.db.models.signals import post_save
    from django.dispatch import receiver
    
    @receiver(post_save, sender=Parent)
    def create_children(sender, **kwargs):
        pass
    

    create_children 将在任何Parent 的实例被保存时被调用。

    参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 2017-05-11
      • 2013-10-06
      相关资源
      最近更新 更多