基于一个字段的查询集差异

时间:2019-10-14 13:43:12

标签: python django django-models django-queryset

我试图基于一个字段比较两个查询集。但是我找不到最有效的方法。

这是我的模型,我想检查新旧room_scans(ForeignKey)是否具有具有相同签入日期的PriceDatum。如果不是,请使用与新room_scan相关的签入日期创建PriceDatum。

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 个答案:

答案 0 :(得分:1)

不要选择包含创建时间的字段。用values限制您的QS。