首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在django中限制相关对象的选择?

如何在django中限制相关对象的选择?
EN

Stack Overflow用户
提问于 2011-10-28 00:13:27
回答 2查看 1.4K关注 0票数 2

我正在尝试使用django来组织和管理我的临床研究数据。我想我只需要管理界面就可以了,因为这是一个幕后数据库,不需要公开。我会编程,但以前从来没有用过python,所以我被简单的事情卡住了。

我的病人需要多次就诊。每次访问都会涉及多次扫描。在管理界面中,我可以看到所有的访问和扫描,就像每个患者页面上的内联一样。但是,在添加新的扫描时,我如何才能使它与哪个就诊关联的选择仅限于相关患者的就诊,而不是其他患者的就诊?

型号(简化):

代码语言:javascript
复制
class Patient(models.Model):
  patient_id = models.CharField(max_length=16, primary_key=True)
  first_name = models.CharField(max_length=64)
  last_name = models.CharField(max_length=64)

class Visit(models.Model):
  patient = models.ForeignKey(Patient)
  visit_date = models.DateTimeField()

class Scan(models.Model):
  patient = models.ForeignKey(Patient)
  visit = models.ForeignKey(Visit)
  scan_type = models.CharField(max_length=32)

非常感谢你的帮助...

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-28 23:20:07

两个示例仅略有不同:

首先:

代码语言:javascript
复制
class ScanInlineAdmin(admin.TabularAdmin):
    model = Scan
    formset = ScanInlineFormset

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "visit":
            patient = self.get_object(kwargs['request'], Patient)
            kwargs["queryset"] = Visit.objects.filter(patient=patient)
        return super(ScanInlineAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)   

    def get_object(self, request, model):
        object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
        try:
            object_id = int(object_id)
        except ValueError:
            return None
        return model.objects.get(pk=object_id)

第二:

代码语言:javascript
复制
class ScanInline(admin.TabularInline):
    model = Scan
    formset = ScanInlineFormset

    def formfield_for_dbfield(self, field, **kwargs):
        if field.name == 'visit':
            # Note - get_object hasn't been defined yet
            patient = self.get_object(kwargs['request'], Patient)
            vists = Visit.objects.filter(patient=patient)
            return forms.ModelChoiceField(queryset=visits)
        return super(ScanInline, self).formfield_for_dbfield(field, **kwargs)

    def get_object(self, request, model):
        object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
        try:
            object_id = int(object_id)
        except ValueError:
            return None
        return model.objects.get(pk=object_id)

你可能会发现这个article很有帮助。我假设您在患者页面中编辑/查看您想要输入新扫描的位置。对吗?

票数 1
EN

Stack Overflow用户

发布于 2011-10-28 20:25:02

我认为formfield_for_foreignkey方法会对你有很大帮助。你可以在admin类中实现它。参见docs

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7919001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档