Запись объекта цепочки внешних ключей 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)
Вернуться на верх