【问题标题】:Django - Get name of model object by iterating through classDjango - 通过遍历类来获取模型对象的名称
【发布时间】:2019-05-14 05:19:55
【问题描述】:

我是 Python 的新手(而且总体上对编程非常缺乏经验),但我有一个问题,我一辈子都无法解决。

我正在尝试使用数据库中另一个模型/类的实例名称预填充数据库中的字段。具有我要预填充的字段的模型是我试图从中获取名称的模型实例的“实例”,并且具有该实例的外键。

目标:1) 用户通过将外键分配给父对象来选择对象的父对象 2) 一个函数获取与用户选择的外键匹配的父实例的名称。 3) 该函数的结果用作该字段的默认值。

代码如下:

class Injury(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular injury')
    name = models.CharField(max_length=200, help_text='Enter an injury or complication (e.g. respiratory failure)')
    description = models.TextField(max_length=1000, blank=True, help_text='Describe the injury')
    time_to_onset = models.PositiveIntegerField(blank=True, validators=[MaxValueValidator(10000)], help_text='Enter expected time from trigger until injury/complication onset')
    findings = models.TextField(max_length=1000, blank=True, help_text='Enter the signs and symptoms of the injury or complication')
    vitals_trends = models.TextField(max_length=1000, blank=True, help_text='Enter the vitals changes due to the injury')

    class Meta:
        ordering = ['name']

    def __str__ (self):
        return self.name

    def get_absolute_url(self):
        return reverse('Injury-detail', args=[str(self.id)])




class Injury_Instance(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular injury')
    parent_case = models.ForeignKey(PFC_Case, on_delete=models.SET_NULL,null=True)
    injury_model = models.ForeignKey(Injury, on_delete=models.SET_NULL, null=True)

    def set_injury_name(self):
        for injuries in Injury.all()
            if injury_model == injuries
                break
        return Injury.name

    name = dislay_models.CharField(default=set_injury_name(self,Injury,injury_model), max_length=100)
    triggered_by = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True)

    def __str__ (self):
        return self.name

    def get_absolute_url(self):
        return f'{self.id} ({self.Injury.name})'

问题区域是def set_injury_nameInjury_Instance.name

谢谢!!!

编辑:

我尝试了以下代码,但收到错误“NameError: name 'self' is not defined”

class Injury_Instance(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular injury')
    parent_case = models.ForeignKey(PFC_Case, on_delete=models.SET_NULL,null=True)        
    injury_model = models.ForeignKey(Injury, on_delete=models.SET_NULL, null=True)

    def get_injury_name(self):
        return self.name

    injury_name=get_injury_name(self)

    name = models.CharField(default=injury_name, max_length=100)

    triggered_by = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True)

    def __str__ (self):
        return self.name
    def get_absolute_url(self):
        return f'{self.id} ({self.Injury.name})'

【问题讨论】:

  • 您是否尝试过创建一个仅包含交换数据的函数/类的简化模型来验证您的计划?什么不完全有效?
  • 我还没有,但它总是卡在 Injuries.all() 上,说它是未定义的。我基本上尝试了我能想到的每一个变化。我不知道如何正确引用模型。

标签: python django oop


【解决方案1】:

您无需存储外键字段的名称,因为您始终可以通过以下方式访问它:

self.injury_model.name

如果您需要通过name 访问它,您可以在 Injury_Instance 模型中编写一个属性。

@property
def name(self):
    return self.injury_model.name

【讨论】:

  • 谢谢!我会试试这个。这比我尝试做的要容易得多!
  • 如果有帮助,您能否将我的回答标记为解决方案?祝你好运!
  • 如果有帮助,您能否将我的回答标记为解决方案?祝你好运! – Sergey Pugach 9 小时前 它仍然无法正常工作。顺便说一句,我真的很感谢你的帮助。我不想使用@property 技术,因为我希望用户能够在预先填充名称字段后更改它(如果可能的话)。看看我评论中的编辑,看看我尝试了什么。
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 2018-11-03
  • 2021-02-21
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多