Как получить Queryset из списка идентификаторов без использования цикла?

Я хочу получить данные из базы данных, используя список идентификаторов. У меня есть модель.

class Point(models.Model):
    p1 = models.IntegerField()
    p2 = models.IntegerField()

У этой модели есть куча данных в моей базе данных. У меня есть список идентификаторов, данные которых имеются в моей базе данных. [1,2,3,3,4,1]

Я хочу получить данные из идентификаторов моего списка. Я знаю решение, что могу применить здесь цикл и получить данные путем итерации по списку. Я искал лучшее решение.

Я видел похожее решение с Point.objects.filter(id__in=[1,2,3,3,4,1]), но оно не возвращает объекты повторяющихся значений, таких как 1 и 3 в случае моего списка. Я хочу, чтобы в наборе запросов были дублирующиеся значения, если в моем списке есть дублирующиеся значения. Заранее спасибо.

В соответствии с вашим вопросом, поймите этот момент...

Во-первых, вам нужен уникальный идентификатор для получения объекта, который имеет похожие значения. Например, в группе студентов есть два студента с одинаковыми именами. Мы считаем, что это "Боб". Теперь, чтобы идентифицировать студента "Боб", которого я должен найти, мне нужен его номер группы. Как мы знаем, roll no. уникален для каждого студента, поэтому ваш список ID должен содержать его первичный ключ для идентификации объекта, к которому вы хотите обратиться.

Надеюсь, этот ответ прояснит ваши сомнения!

Если я правильно понял ваш комментарий, то вы поместили ForeignKey в неправильный класс, так как в том виде, в котором он у вас сейчас:

class Point(models.Model): 
    p1 = models.IntegerField() 
    p2 = models.IntegerField() 
    
class Graph(models.Model): 
    user=models.ForeignKey(User, on_delete=models.CASCADE) 
    date_created = models.DateTimeField(auto_now_add=True) 
    point = models.ForeignKey(Point, on_delete=models.CASCADE)

Для КАЖДОЙ точки будет МНОГО графиков. Должно быть наоборот, чтобы у вас было МНОГО точек на ОДИН график:

class Point(models.Model): 
    p1 = models.IntegerField() 
    p2 = models.IntegerField()
    graph = models.ForeignKey(Graph, on_delete=models.CASCADE)
    
class Graph(models.Model): 
    user=models.ForeignKey(User, on_delete=models.CASCADE) 
    date_created = models.DateTimeField(auto_now_add=True) 

Тогда, в вашем представлении, вы могли бы получить все Point в вашем графике следующим образом:

graph = Graph.objects.get(user=..., date_created=...)
# Here is the filter that will give you all Points on the graph:
points = Point.objects.filter(graph=graph)

# If you need the points as an array
points_list = []

for point in points:
    # Your logic here, or if you just need the array you could
    # append to the points_list:
    points_list.append(point)

Обратите внимание
. Я понимаю, что это все еще может использовать цикл, и что фильтр в points = Points.objects.filter(graph=graph) все еще не будет повторять одну и ту же точку. Опять же, даже если Point может быть тем же самым местом, и/или может иметь другие данные, связанные с ним, все из которых равны, это все еще уникальная точка с ее собственным первичным ключом, pk.

Если вам по-прежнему нужен массив (в Python массивы называются списками) из Point с повторяющимися ID, то вам придется сделать цикл, но тогда остается вопрос. Действительно ли вам нужны идентификаторы этих Points? Используете ли вы ID в своих вычислениях?

Вернуться на верх