Джанго: заказы многие ко многим - PullRequest
0 голосов
/ 22 мая 2019

У меня есть сервер «многие ко многим» через сеть ip:

class Server(models.Model):
    hostname = models.CharField(max_length=50)
    networks = models.ManyToManyField(Network, through='Ip')

class Network(models.Model):
    name = models.CharField(max_length=50)

class Ip(models.Model):
    ip = models.CharField(max_length=20)
    server = models.ForeignKey(Server) # initially this line was missing

Я отображаю это в таблице:

Hostname | Network 1 | Network 2
==============================
server 1 | 1.1.1.10  | 5.5.5.100
server 2 | 1.1.1.15  | 5.5.5.20

Мне нужно, чтобы эта таблица была упорядочена по столбцам. Упорядочить по столбцам легко:

Server.objecs.all().order_by('hostname')

Как я могу сделать то же самое с двумя другими столбцами? Например. если таблица упорядочена по столбцу «Сеть 2», порядок будет «сервер 2, сервер 1».

РЕДАКТИРОВАТЬ: исправил код.

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Хорошо, вот как мне удалось это сделать:

Сначала нам нужно преобразовать набор запросов в список:

qs = Server.objects.all()
net = Network.objects.get(pk=1) # we gonna sort servers by ip in this network
list = [x for x in qs]

или

list = list(qs)

тогда мы можем отсортировать этот список.Не все серверы имеют ip в каждой сети, поэтому нам нужно проверить, не является ли ip None:

list.sort(key=lambda x: x.ip_set.filter(network=net).first().ip if x.ip_set.filter(network=net).first() is not None else 0)
0 голосов
/ 22 мая 2019

Если вы хотите заказать таблицу «многие ко многим» в Django , вам нужна промежуточная модель (прежде всего).У вас IP модель не хорошая (ИМО).Совсем не закончено.

class Server(models.Model):
    hostname = models.CharField(max_length=50)
    networks = models.ManyToManyField(to='Network', through='ServerNetworkRel')

    class Meta:
        db_table = 'server'

    def __str__(self):
        return self.hostname

class Network(models.Model):
    name = models.CharField(max_length=50)


    class Meta:
        db_table = 'network'

    def __str__(self):
        return self.name

class ServerNetworkRel(models.Model):
    ip = models.CharField(max_length=20)
    server = models.ForeignKey(to=Server, on_delete=models.PROTECT)
    network = models.ForeignKey(to=Network, on_delete=models.PROTECT)

    class Meta:
        db_table = 'server_network_rel'

    def __str__(self):
        return self.server.hostname + ' ' + self.network.name

и выполните SQL-запрос сейчас ,,,

filtered_rows = ServerNetworkRel.objects.select_related('server', 'network').order_by('network__field') # This returns ServerNetworkRel which has already made INNER JOIN On (Server and Network)

for row in filtered_rows:
    print(row.server) # returns Server instance
    print(row.network) # returns Network instance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...