Запись объекта цепочки внешних ключей Django?
Я работаю над командой управления, которая будет записывать некоторые данные из json в таблицы базы данных. в результате я хочу записать объекты, принадлежащие таблице, которая является ForeignKey для другой таблицы, и эта таблица также является ForeignKey для своей корневой таблицы, поэтому объекты в таблице C(HostOsScanned) >> ForeignKey таблицы B(HostScanned), которая является >> ForeignKey для таблицы A(SiteAssest)
Таблица из моделей показана ниже
я знаю как писать в случае таблицы A>B, но не при таком сценарии с цепочкой зависимостей внешнего ключа
как в примере ниже
Помогите пожалуйста
Спасибо
---пример--
def handle(self, *args, **options):
scan_name_id=SiteAssest.objects.get(scan_name=options['scan_name_id'])
scan_iphost = HostScanned(
host_ip_name=options['host_ip_name'],
resolved_hostname=options['resolved_hostname'],
resolve_type =options['resolve_type'],
mac_address=options['mac_address'],
mac_addr_type=options['mac_addr_type'],
mac_vendor=options['mac_vendor'],
host_state=options['host_state'],
host_state_method=options['host_state_method'],
host_state_ttl=options['host_state_ttl'],
scan_name_id=int(scan_name_id.id),
)
try:
scan_iphost.save()
self.stdout.write(self.style.SUCCESS('Success HostScanned write'))
except Exception as e:
print('id scanned',scan_name_id.id)
self.stdout.write(self.style.ERROR(e))
--model---
class SiteAssest(models.Model):
scan_name = models.CharField(max_length=250,blank=False)
site_name = models.CharField(max_length=250,blank=False)
location_name = models.CharField(max_length=250,blank=False)
# Geo location
lon = models.FloatField()
lat = models.FloatField()
site_ip_range1 = models.CharField(max_length=250,blank=True)
site_ip_range2 = models.CharField(max_length=250,blank=True)
site_ip_range3 = models.CharField(max_length=250,blank=True)
#new entry
scan_time_start = models.DateTimeField(default=datetime.date.today())
scan_timestr_start = models.CharField(max_length=250,blank=True)
scan_time_end = models.DateTimeField(default=datetime.date.today())
scan_timestr_end = models.CharField(max_length=250,blank=True)
scan_elapsed = models.IntegerField(blank=True, null=True)
scan_exit_resault = models.CharField(max_length=50,blank=True)
scan_args = models.CharField(max_length=250,blank=True)
nmap_version = models.CharField(max_length=50,blank=True)
# end new entry
last_scaned = models.DateField(auto_now_add=False, null=True)
TASK_STATUS_CHOICES = [
('ID', 'IDLE'),
('RU', 'RUNNING'),
]
current_status = models.CharField(max_length=2,choices=TASK_STATUS_CHOICES,default='IDLE')
site_rank = models.IntegerField(null=True)
scan = models.ForeignKey(ScanSet, on_delete=models.RESTRICT)
scan_count = models.IntegerField(default=0)
def __str__(self):
return self.scan_name
class HostScanned(models.Model):
scan_name = models.ForeignKey(SiteAssest, on_delete=models.CASCADE)
host_ip_name = models.CharField(max_length=250,blank=True)
resolved_hostname = models.CharField(max_length=250,blank=True)
resolve_type = models.CharField(max_length=250,blank=True)
mac_address = models.CharField(max_length=250,blank=True)
mac_addr_type = models.CharField(max_length=250,blank=True)
mac_vendor = models.CharField(max_length=250,blank=True)
host_state = models.CharField(max_length=50,blank=True)
host_state_method = models.CharField(max_length=50,blank=True)
host_state_ttl = models.CharField(max_length=50,blank=True)
def __str__(self):
return str(self.host_ip_name)
class HostOsScanned(models.Model):
host_ip_name = models.ForeignKey(HostScanned, on_delete=models.CASCADE)
os_type = models.CharField(max_length=50,blank=True)
os_accuracy = models.CharField(max_length=50,blank=True)
os_name = models.CharField(max_length=300,blank=True)
os_fingerprint = models.CharField(max_length=300,blank=True)
os_family = models.CharField(max_length=100,blank=True)
os_vendor = models.CharField(max_length=100,blank=True)
os_cpe = models.CharField(max_length=300,blank=True)
def __str__(self):
return str(self.os_type)