Django 2:如何在管理界面中强制使用外键

时间:2019-01-22 03:19:41

标签: django

我是Django和Python的新手。假设我正在构建一个应用程序来管理公司用户使用的设备。我有多个公司,每个公司都有多个用户和房间。

房间和用户始终与公司链接。

设备可以链接到:

  • 用户(“乔的iPhone”,“安娜的笔记本电脑”)
  • 会议室(“会议室的计算机”)

设备始终与公司链接。

因此,我可以拥有仅与公司链接的设备。

这是我的代码:

models.py:

class Company(models.Model):
    name=models.CharField(max_length=50)

class User(models.Model):
    name=models.CharField(max_length=50)
    company=models.ForeignKey('Company', on_delete=models.CASCADE)

class Room(models.Model):
    name=models.CharField(max_length=50)
    company=models.ForeignKey('Company', on_delete=models.CASCADE)

class Device(models.Model):
    company=models.ForeignKey('Company', on_delete=models.CASCADE)
    user=models.ForeignKey('User', on_delete=models.CASCADE,  blank=True, null=True)
     room=models.ForeignKey('Room', on_delete=models.CASCADE,  blank=True, null=True)

admin.py:

class DevicesInline(admin.TabularInline):
    model = Device
    extra = 0
    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field == "Company":
            kwargs['queryset'] = ## Here I don't know ##
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

class UserAdmin(admin.ModelAdmin):
    inlines = [DeviceInline]

我想要的非常简单:编辑用户(或房间)时,我希望能够为其添加设备。但是字段Company必须由用户或房间的公司填写,并且不能修改。就是这样:)

PS:我不知道该设备是否已经链接到公司(如果已经链接到用户或房间)?这是另一个问题。

2 个答案:

答案 0 :(得分:0)

在Django中,要标记必填字段,您必须将kwarg blank blank=False添加到该字段,以及添加null=False以在数据库上实施该关系。 在您的情况下,如果您要强制用户添加公司:

class User(models.Model):
    name=models.CharField(max_length=50)
    company=models.ForeignKey('Company',blank=False,null=False, on_delete=models.CASCADE)

class Room(models.Model):
    name=models.CharField(max_length=50)
    company=models.ForeignKey('Company',blank=False,null=False, on_delete=models.CASCADE)

此外,假设设备已链接到CompanyA,而设备空间已链接到CompanyB,则无需在Device模型中添加Company作为ForeignKey,您的数据将不准确。

关于将公司设为只读字段,请查看此answer

class MyModelAdmin(admin.ModelAdmin):

    def get_readonly_fields(self, request, obj=None):
        if obj: # editing an existing object
            return self.readonly_fields + ('field1', 'field2')
        return self.readonly_fields

答案 1 :(得分:0)

本周我没有时间从事此工作,但我对此表示怀疑。

设备将链接到公司,用户或房间。它必须链接到其中之一。因此,如果设备链接到用户,就像用户链接到公司一样,则设备也链接到用户的公司。

现在,我只需要在模型内部做一些事情,说设备必须有公司,用户或房间。我不知道该怎么做。