私はDjango(とその点ではデータベース)に慣れていて、学習に役立つ簡単なインベントリアプリケーションを作成しようとしています。私はチュートリアルを終えていくつかの本を読んでいますが、私は単純だと思うところで立ち往生しています。基本インベントリアプリケーション用のDjangoモデルデザイン
インベントリアプリケーションを使用すると、そのメーカーにはその製造元のみのモデル番号が付いた製造元があります。 Dell Optiplex 3040と言うことができます。私は今でも管理コンソールを使っています。だから、私は、機器をメーカーに関連させて、その機器をモデル番号に関連付けることができるようにしたいと考えています。それは私が何をしようとしているのかを達成するために多くのフィールドとスルーフィールドを使用する必要があるように思えるが、それを行う正しい方法だとは思わない(以下のリンクに示す)。 https://docs.djangoproject.com/en/1.9/topics/db/models/#many-to-many-relationships
以下は、これまでのコードです。ありがとうございました。
from django.db import models
# Create your models here.
class Department(models.Model):
department = models.CharField(max_length=50)
def __str__(self):
return self.department
class Manufacturer(models.Model):
manufacturer = models.CharField(max_length=50)
def __str__(self):
return self.manufacturer
class EquipmentModel(models.Model):
equipmentModel = models.CharField(max_length=50)
def __str__(self):
return self.equipmentModel
class Employees(models.Model):
employee_name_first = models.CharField(max_length=25)
employee_name_last = models.CharField(max_length=25)
employee_username = models.CharField(max_length=20)
phone = models.IntegerField()
assigned_equipment = models.ForeignKey('Device', default='undefined')
department = models.ForeignKey('Department', on_delete=models.CASCADE, default='undefined')
job_title = models.ManyToManyField('Job_Positions', default='undefined')
def __str__(self):
return self.employee_username
class Device(models.Model):
ip = models.GenericIPAddressField(protocol='IPv4',unpack_ipv4=False,null=True, blank=True)#might be good to seperate IP in its own class because a device can have multiple IP's
department = models.ForeignKey('Department', on_delete=models.CASCADE)
manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE)
serial_number = models.CharField(max_length=50)
date_created = models.DateTimeField(auto_now=False, auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True, auto_now_add=False)
comments = models.TextField(blank=True)
def __str__(self):
return self.serial_number
class Job_Positions(models.Model):
position_title = models.CharField(max_length=50)
position_description = models.TextField(blank=True)
def __str__(self):
return position_title
***私が答えなければならなかったのは、更新されたコードとadmin.pyコードを編集するために編集します。
#admin.py
from django.contrib import admin
# Register your models here.
from .models import Device,Department,Manufacturer,Employees, Job_Positions, EquipmentModel
class DeviceModelAdmin(admin.ModelAdmin):
list_display = ["ip", "department","model","serial_number","date_updated"]
list_filter = ["department","model","ip"]
search_fields = ["ip"]
class Meta:
model = Device
class EmployeesModelAdmin(admin.ModelAdmin):
list_display = ["employee_name_first", "employee_name_last", "employee_username", "phone"]
list_filter = ["department"]
class Meta:
model = Employees
admin.site.register(Device, DeviceModelAdmin)
admin.site.register(Department)
admin.site.register(Manufacturer)
admin.site.register(EquipmentModel)
admin.site.register(Employees, EmployeesModelAdmin)
admin.site.register(Job_Positions)
更新models.py
from django.db import models
# Create your models here.
class Department(models.Model):
department = models.CharField(max_length=50)
def __str__(self):
return self.department
class Manufacturer(models.Model):
manufacturer = models.CharField(max_length=50)
def __str__(self):
return self.manufacturer
class EquipmentModel(models.Model):
model_number = models.CharField(max_length=50)
manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE)
def __str__(self):
return self.model_number
class Employees(models.Model):
employee_name_first = models.CharField(max_length=25)
employee_name_last = models.CharField(max_length=25)
employee_username = models.CharField(max_length=20)
phone = models.IntegerField()
assigned_equipment = models.ForeignKey('Device', default='undefined')
department = models.ForeignKey('Department', on_delete=models.CASCADE, default='undefined')
job_title = models.ManyToManyField('Job_Positions', default='undefined')
def __str__(self):
return self.employee_username
class Device(models.Model):
ip = models.GenericIPAddressField(protocol='IPv4',unpack_ipv4=False,null=True, blank=True)#might be good to seperate IP in its own class because a device can have multiple IP's
department = models.ForeignKey('Department', on_delete=models.CASCADE)
model = models.ForeignKey('EquipmentModel', on_delete=models.CASCADE,null=True)
serial_number = models.CharField(max_length=50)
date_created = models.DateTimeField(auto_now=False, auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True, auto_now_add=False)
comments = models.TextField(blank=True)
def __str__(self):
return self.serial_number
class Job_Positions(models.Model):
position_title = models.CharField(max_length=50)
position_description = models.TextField(blank=True)
def __str__(self):
return position_title
、しかし、それは私が思っていた正確な効果を(少なくとも管理サイトで)持っていません。これは、フロントエンドのことですが、モデルリストを管理者の製造元に依存させる方法がありますか?私はDell、HP、IBMのectを持っていて、それぞれの下に多くのモデルがあると言うと、メーカーのリストにドロップダウンで表示されるモデルを制限する方法はありますか?メインポストにある管理サイトのコードを更新します。 – user5356976
これを達成するには、Djangoの管理用テンプレートを変更する必要があります。しかし、メーカーがモデルを簡単に選ぶことができれば、 'EquipmentModel'の' __str__'メソッドを '' {} - {} 'のように変更するだけでよいのですが、format(self.manufacturer。 manufacturer、self.model_number) 'を呼び出し、デフォルトの順序を製造元に変更します。 – solarissmoke
ありがとう、それは簡単な方法です。私はあなたが自己を持っていることに気付きました。製造業者。なぜあなたは2つのメーカーを持っていますか?機器モデルクラス内の外部キーの代わりにクラスを指しているでしょうか?それがクラスを指している場合は、最初の製造元をManufacturer.manufacturerのように大文字にする必要はありませんか?両方ともself.manufacturerとself.manufacturer.manufacturerのように設定されている場合に動作するように見えます。どうして分かりません、助けてくれてありがとう! – user5356976