如何从模型实例中确定相关模型?

时间:2014-10-21 13:26:49

标签: django foreign-key-relationship

Class A(models.Model):
    text = models.CharField(...)


Class B(models.Model):
    a = models.ForeignKey('A')
    more_text = models.CharField(...)
  1. 我有一个A
  2. 的实例
  3. 我可以使用instance._meta.fields获取所有字段。
  4. 我可以使用many_to_many获取instance._meta.many_to_many字段。
  5. 我如何获得相关模型? (以通用方式)

    我想要这个的原因是因为如果我想在模板上显示A的实例,A不完整而没有来自B的外键关系。

3 个答案:

答案 0 :(得分:1)

1)首先猜测你的意思是什么:

models.ForeignKey('A', related_name='my_model_b')

然后在模板中你可以{{ a.my_model_b_set.all }}将所有B对象附加到给定的A对象。

2)第二次猜测你的意思是什么:

如果您有一个表单,您可以在其中创建 B 对象,并且您需要类似"预先存储"连接到 A 的对象然后你需要通过AJAX调用选择 A 对象发送并做更进一步的操作(例如在此模型中另一个Fk字段中的过滤器选择)

答案 1 :(得分:1)

这将为您提供所有相关模型的名称:

models = [r.var_name for r in a_obj._meta.get_all_related_objects()]

答案 2 :(得分:0)

我几天前解决了这个问题:

模型是这样的:

from model_utils.managers import InheritanceManager

Class A(models.Model):
    """
    @documention
    """
    text = models.CharField(...)
    related_content = models.ManyToManyField(
        "self", null=True, blank=True, )
    objects = InheritanceManager()


Class B(models.Model):
    """
    @documention
    """
    a = models.ForeignKey('A')
    more_text = models.CharField(...)

注意InheritanceManager

class BDetailView(generic.DetailView):
    """
    @documention
    """
    model = B

    def get_context_data(self, **kwargs):
        context = super(BDetailView, self).get_context_data(**kwargs)
        context['related_content'] = A.objects.filter(
            related_content=self.object).select_subclasses()
        return context

使用model_utils,我可以获得实际的相关模型,而不是'A'实例(缺少大量特定内容)