2016-04-18 6 views
0

私は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 

答えて

0

機器のどの部分が(私は仮定)一つだけのメーカーを持つことができるので、多対多の関係は、あなたがここに欲しいものではありません。

モデル情報を保存する中間モデルが必要ですが、既にEquipmentModelには1つあります。私は次のようにそれを修正することをお勧め:

class EquipmentModel(models.Model): 
    # This stores information about a particular model of device 
    manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE) 
    model_number = models.CharField(max_length=50) 

そして代わりにDeviceでメーカーへの外部キーを持つ、機器モデルへの外部キーに置き換える:理にかなっている

class Device(models.Model): 
    # ... 
    model = models.ForeignKey('EquipmentModel', on_delete=models.CASCADE) 
+0

、しかし、それは私が思っていた正確な効果を(少なくとも管理サイトで)持っていません。これは、フロントエンドのことですが、モデルリストを管理者の製造元に依存させる方法がありますか?私はDell、HP、IBMのectを持っていて、それぞれの下に多くのモデルがあると言うと、メーカーのリストにドロップダウンで表示されるモデルを制限する方法はありますか?メインポストにある管理サイトのコードを更新します。 – user5356976

+0

これを達成するには、Djangoの管理用テンプレートを変更する必要があります。しかし、メーカーがモデルを簡単に選ぶことができれば、 'EquipmentModel'の' __str__'メソッドを '' {} - {} 'のように変更するだけでよいのですが、format(self.manufacturer。 manufacturer、self.model_number) 'を呼び出し、デフォルトの順序を製造元に変更します。 – solarissmoke

+0

ありがとう、それは簡単な方法です。私はあなたが自己を持っていることに気付きました。製造業者。なぜあなたは2つのメーカーを持っていますか?機器モデルクラス内の外部キーの代わりにクラスを指しているでしょうか?それがクラスを指している場合は、最初の製造元をManufacturer.manufacturerのように大文字にする必要はありませんか?両方ともself.manufacturerとself.manufacturer.manufacturerのように設定されている場合に動作するように見えます。どうして分かりません、助けてくれてありがとう! – user5356976

関連する問題