【问题标题】:Django - How to reach relational fieldDjango - 如何到达关系领域
【发布时间】:2021-10-09 21:21:00
【问题描述】:

我有与 ICF 模型有多对多关系的患者模型。 ICF 模型与 Unite 模型具有多对一字段。在 Unite 模型中,我有 Unite 名称。我想找到分配给有关系的患者的 Unite 名称。我尝试找到每位患者的 Unite 名称。如果不止一个,我无法为那个人列出它们。这是我的代码。

这是我的病人模型。

class Patient (models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255, default="doe")
    data = models.JSONField()
    Intensivecare_form = models.ManyToManyField(Intensivecare_Form)
    isDeleted = models.BooleanField(default=False)

这是我的 ICF 模型。

class Intensivecare_Form (models.Model):
    id = models.AutoField(primary_key=True)
    hospitals_id = models.ForeignKey(Hospital, on_delete=models.CASCADE)
    formname = models.CharField(max_length=128)
    data = models.JSONField()
    unites_id = models.ForeignKey(Unite, on_delete=models.CASCADE)

最后,这是我的 Unite 模型

class Unite (models.Model):
    id = models.AutoField(primary_key=True)
    unitename = models.CharField(max_length=128)

在我的 views.py 文件中,我有一个如下功能

def listPatients(request):
    Patients = Patient.objects.all()
    output = []
    for patient in Patients:
        unitename = []
        icfinfo = serializers.serialize('json', patient.Intensivecare_form.all())
        jsonicfinfo = json.loads(icfinfo)
        unitename.append(jsonicfinfo)
        output.append({'id': patient.id,
                       'fname': patient.name,
                       'lname': patient.lastname,
                       'data': patient.data,
                       'unitename': unitename,
                       })
    return JsonResponse(output, safe=False)

这就是输出的样子。我需要在 unitename 中到达 formname

0-> id, fname..., unitename-> 0 -> 字段 -> unitename

【问题讨论】:

  • 您是否有理由覆盖每个模型的 id 字段而不是使用 Django 默认值?另外,您能否更明确地说明这个问题。
  • 我是 django 的新手。我想通过创建项目来学习。覆盖每个模型的 id 字段是什么意思?我的问题是我怎样才能为每个人达到类似于 person.icform.unites_id.unitesname 的统一名称?
  • Django 会自动为您添加 ID 字段 - 您不必显式执行此操作,除非您想要不同的 ID 类型 IE uuid。

标签: django model many-to-many relational-database relationship


【解决方案1】:

您的 ICForm 似乎只指向一个 Unite 对象。

也许试试这个来获取查询中的所有 ICForm。

代替

unitename = []
icfinfo = serializers.serialize('json', patient.Intensivecare_form.all())
jsonicfinfo = json.loads(icfinfo)
unitename.append(jsonicfinfo)

尝试将 Intensivecare_form 模型 rename unites_id 重命名为 unites -- django 知道自动链接 id 并调用它 unites_id 可能会导致命名冲突

Intensivecare_Form(models.Model):
    unites = models.ForeignKey(Unites, on_delete=models.CASCADE)

要获取所有单位名称,只需在一个查询中获取它

   unite_names = list(patient.Intensivecare_form.all().values_list('unites__unitename', flat=True))

这应该为你做!祝你好运!

【讨论】:

  • 它有效,但如果表单具有相同的统一名称,则会出现重复。我该如何解决?
  • 这是一个两步过程 1. 更改 unite_names = list(patient.Intensivecare_form.all().values_list('unites__unitename', flat=True).distinct()) 2. 支持我的答案 :) )
  • 你是一个救生员。谢谢。
  • 已经保存了很多,所以我要自己保存一些!言归正传,抢夺战利品!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
相关资源
最近更新 更多