Django: Abhängigkeit zwischen 2 Model Feldern

Django, Flask, Bottle, WSGI, CGI…
Antworten
schrodi
User
Beiträge: 16
Registriert: Dienstag 10. Mai 2016, 12:59

Hallo zusammen,

ich stehe gerade etwas auf dem Schlauch. Ich möchte eine Abhängigkeit zischen 2 Spalten/Feldern in einem Model herstellen.
Folgende Models habe ich:


Die Definitionen der Hardwaretypes:

Code: Alles auswählen

class Hardware(BaseModel):
	#ForeignKey
	product 		= models.ManyToManyField('product.Product',related_name='hardware_product')

	#Info
	manufacturer 	= models.CharField(max_length = 100, blank=False, null=False, )
	name 		= models.CharField(max_length = 100, blank=False, null=False, )
	software		= models.CharField(max_length = 100, blank=False, null=True, )
	
	interfaces 		= GenericRelation(Interface)
	
	class Meta:
		unique_together = ('manufacturer', 'name',)

class ChassisSlot(BaseModel):
	hardware 		= models.ForeignKey("Hardware", blank=False, null=False)
	slotNumber 	= models.CharField(max_length = 100, blank=False, null=False, )
	comment		= models.TextField(default="", blank=True)
	
	class Meta:
		unique_together = ('hardware', 'slotNumber',)

class NicCard(BaseModel):
	hardware		= models.ManyToManyField('Hardware',related_name='hardware_related')
	interfaces 		= GenericRelation(Interface)
	manufacturer 	= models.CharField(max_length = 100, blank=False, null=False, )
	name 		= models.CharField(max_length = 100, blank=False, null=False, )
	
	class Meta:
		unique_together = ('manufacturer', 'name',)
Die Configs mit der konfigurierten Hardware:

Code: Alles auswählen

class Config(BaseModel):
	# Foreign Keys
	customer 		= models.ForeignKey('customer.Customer', related_name="config_Customers_related")
	site 			= models.ForeignKey('customer.Site', related_name="config_sites_related")
	location		= models.ForeignKey('customer.Location', related_name="config_sites_related")
	product 		= models.ForeignKey('product.Product', related_name="config_products_related")
	template 		= models.ForeignKey('confgen.Template', related_name="config_template_related")
	master_code 	= models.ForeignKey('Code', null=True, related_name="mastercode")
	hardware		= models.ForeignKey('hardware.Hardware', related_name="hardwareConfig_related", null=False, blank=False)
	
	# Info
	hostname 		= models.CharField(max_length=100, blank=False, null=False, unique=True)
	comment	 	= models.TextField(default="", blank=True)
	is_initiated 		= models.BooleanField(default=False)
	is_uptodate 	= models.BooleanField(default=False)
	
	def __unicode__(self):
		return self.hostname

class HardwareSlot(BaseModel):
	config		= models.ForeignKey('Config', related_name="Config_related", null=False, blank=False)
	chassisSlot		= models.ForeignKey('hardware.ChassisSlot',  null=False, blank=False)
	nicCard		= models.ForeignKey('hardware.NicCard',  null=True, blank=False)
	
	class Meta:
		unique_together = ('config', 'chassisSlot')
In den HardwareTyp Definitionen ist einfach gesagt definiert, welche Hardware überhaupt existiert, ob Erweiterungsslots existieren und welche Hardware mit welchen NicCards bestückt werden können.

In der Configapp wird dann die gewählte Hardware und die Bestückung mit NicCards gespeichert.

Mein Problem ist jetzt folgendes:
Ich habe keine Kontrolle in der HardwareSlot Tabelle, dass der Slot auch tatsächlich zu der Hardware gehört, so wie in ChassisSlots definiert.
Ich bräuchte hier jetzt eine Abhängigkeit zu config.hardware, sodass chassisSlot nur die der Hardware zugehörigen Slots enthalten darf.

Ist dies iwie realisierbar. Vll. mit einem Query, das dem Attribut choices zugewiesen wird?

Oder bin ich mit meiner Struktur komplett auf dem Holzweg und ihr habt eine bessere Idee.

Hoffe Ihr konntet mir folgen, wenn nicht anmeckern und ich versuche das Problem anders zu beschreiben.

Gruß schrodi
Zuletzt geändert von Anonymous am Dienstag 9. Mai 2017, 15:43, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Antworten