【问题标题】:How can I add column to the admin from other table, that isn't directly connected?如何从其他表中将列添加到管理员,而不是直接连接?
【发布时间】:2021-01-28 21:36:23
【问题描述】:

我有四个表连接在一起:

  • MeetingPerson的两个外键)

  • Person(多对多字段到'ConditionDictionary'

  • ConditionPersonConditionDictionary的外键)

  • ConditionDictionary

我的Meeting 表有Person 的外键,Person 多对多连接到ConditionDictionary,它通过表Condition(因为我必须在那里添加额外的标志)。

我想将ConditionDictionary 中的一列添加到会议视图,但我不知道该怎么做。

在python shell中运行时,我实现了我所需要的

Meeting.objects.filter(id=1).values('person_in_need__person_c__condition__issue')

但是,如上所述,我不知道如何添加选项以选择它在会议类中返回的内容。

以下是模型(重要部分):

class ConditionDictionary(models.Model):

    issue = models.CharField(max_length=50)

    description = models.TextField()


class Condition(models.Model):

    person = models.ForeignKey(Person, related_name = 'person_c', on_delete=models.CASCADE)

    condition = models.ForeignKey(ConditionDictionary, related_name = 'condition_c', on_delete=models.CASCADE)


class Person(models.Model):

    issue = models.ManyToManyField(ConditionDictionary, through='Condition')


class Meeting(models.Model):

    person1 = models.ForeignKey(Person, related_name='in_need', on_delete=models.CASCADE)

    person2 = models.ForeignKey(Person, related_name='carer', on_delete=models.CASCADE)

我的想法是,每次创建会议时,您都可以选择这次处理的问题。

【问题讨论】:

    标签: django django-models django-views django-admin


    【解决方案1】:

    可以使用django的__(双下划线)显示相关表格数据。

    例如,我有一个链接到UserProfile 模型。 User 还链接到 Passport 模型。

    您可以在search_fields 中看到,它将搜索User 的ID,并通过User 表到Passport 表以按ID 搜索;

    
    @admin.register(Profile)
    class ProfileAdmin(admin.ModelAdmin):
        """ Model admin for Profile. """
        # List attributes.
        list_display = (
            'id',
            'user',
        )
        list_filter = (
            'series_entrant',
        )
        search_fields = (
            'user__id',
            'user__email',
            'user__first_name',
            'user__last_name',
            'user__passport__id'
        )
    

    要在管理类的fields 中显示相关数据,您可以创建一个可调用对象并将其添加到只读字段。例如;

    
    @admin.register(AddOn)
    class AddOnAdmin(admin.ModelAdmin):
        """
        AddOn model admin
        """
        list_display = (
            'id',
            'get_related',
            'enabled',
            'created',
        )
        readonly_fields = (
            'created',
            'modified',
            'get_related',
        )
        fields = (
            'enabled',
            'get_related',
            'name',
            'description',
            'created',
            'modified',
        )
    
        def get_related(self, obj):
            """
            Get some related data
            """
            return obj.realted_model.field
        get_related.short_description = _('Related')
    
    

    【讨论】:

    • 所以它似乎与搜索字段或过滤器一起使用,但当我尝试将它添加到“字段”时却不起作用。也许我做错了什么?如何将其添加为字段? fields = ( 'person_in_need__person_c__condition__issue', ) 不起作用,但 list_filter = ( 'person_in_need__person_c__condition__issue', ) 起作用
    • 是的,这是意料之中的。如果您想将其放入fields,我认为您必须将其设置为只读,并且可能将其作为管理类的可调用对象。您当然不能将其作为可编辑字段进行。 list_display 可能对您最有用
    • 我不想在现场编辑它,因为我会创建预先写好的问题和描述的字典。我想要在会议视图上做的就是为特定的人选择预先创建的问题。我将尝试以 readonly 和 list_display 的形式进行操作,很快就会回来。
    • 似乎仍然不起作用,我不确定为什么
    • @afdkj 我添加了一个可调用的示例以返回相关数据。
    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 2022-01-09
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多