我是Django和Python的新手。假设我正在构建一个应用程序来管理公司用户使用的设备。我有多个公司,每个公司都有多个用户和房间。
房间和用户始终与公司链接。
设备可以链接到:
设备始终与公司链接。
因此,我可以拥有仅与公司链接的设备。
这是我的代码:
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:我不知道该设备是否已经链接到公司(如果已经链接到用户或房间)?这是另一个问题。
答案 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)
本周我没有时间从事此工作,但我对此表示怀疑。
设备将链接到公司,用户或房间。它必须链接到其中之一。因此,如果设备链接到用户,就像用户链接到公司一样,则设备也链接到用户的公司。
现在,我只需要在模型内部做一些事情,说设备必须有公司,用户或房间。我不知道该怎么做。