Как получить 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 в своих вычислениях?