Разница в наборе запросов на основе одного поля - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь сравнить два набора запросов на основе одного поля. Но я не могу найти самый эффективный способ сделать это.

Это моя модель, и я хочу проверить, есть ли у старых и новых room_scans (ForeignKey) PriceDatum с одинаковой датой регистрации. если нет, создайте PriceDatum с этой датой регистрации, связанной с новым room_scan.

class PriceDatum(models.Model):
    """
        Stores a price for a date for a given currency for a given 
    listingscan
        Multiple such PriceData objects for each day for next X months are created in each Frequent listing scan
    """
    room_scan = models.ForeignKey(RoomScan, default=1, on_delete=models.CASCADE)
    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    checkin = models.DateField(db_index=True, help_text="Check in date", null=True)
    checkout = models.DateField(db_index=True, help_text="checkout date", null=True)
    price = models.PositiveSmallIntegerField(help_text="Price in the currency stated")
    refund_status = models.CharField(max_length=100, default="N/A")
    # scanned = models.DateTimeField(db_index=True, help_text="Check in date", null=True)
    availability_count = models.PositiveSmallIntegerField(help_text="How many rooms are available for this price")
    max_people = models.PositiveSmallIntegerField(help_text="How many people can stay in the room for this price")
    meal = models.CharField(max_length=100, default="N/A", help_text="Tells if breakfast is included in room price")

Ниже приведен код, который я пытаюсь сделать:

previous_prices_final = previous_prices.filter(refund_status='refund',

current_prices_final=current_prices.filter(
    refund_status='refund', max_people=max_people_count, meal=meal).order_by().order_by('checkin')

if len(previous_prices_final) > len(current_prices_final):
    difference=previous_prices_final.difference(current_prices_final)

    for x in difference:
        PriceDatum.objects.create(room_scan=x.room_scan,
                                    room=x.room,
                                    checkin=x.checkin,
                                    checkout=x.checkout,
                                    price=0,
                                    refund_status='refund',
                                    availability_count=0,
                                    max_people=max_people_count,
                                    meal='not_included',
                                    )

Дело в том, что я получаювсе запросы различны, так как внешний ключ room_scan имеет разное время создания.

Мой вопрос: как мне использовать difference(), основываясь только на поле для регистрации.

1 Ответ

1 голос
/ 14 октября 2019

Не выбирайте поле, содержащее время создания. Ограничьте свой QS значениями .

...