如何检查项目是否在中间表中并将其排除?

时间:2016-02-16 16:19:55

标签: python django django-models

我有以下型号:

class Event(models.Model):
    name = models.CharField(max_length=128)

class Order(models.Model):
    requester = models.CharField(max_length=128)
    taker = models.CharField(max_length=128)
    email = models. EmailField()
    phone = models.CharField(max_length=13)

class Picture(models.Model):
    event = models.ForeignKey(Event, related_name="pictures")
    image = models.ImageField(upload_to='media')
    show_name = models.CharField(max_length=128, blank=True, null=True)
    file_name = models.CharField(max_length=128, blank=True, null=True)

class OrderItem(models.Model):
    order = models.ForeignKey(Order)
    picture = models.ForeignKey(Picture)
    amount = models.PositiveSmallIntegerField()

我需要获得属于某个事件的所有照片。像这样:

Event 1:
Pic 1, Pic 2

Event 2:
Pic 3, Pic 4

Order 1:
Pic 1

Order 2:
Pic 3

我需要什么:

Event 1 has Pic 1 in an Order, so it can't be deleted
Event 2 has Pic 3 in an Order, so it can't be deleted

Pic 2 in Event 1 can be deleted
Pic 4 in Event 2 can be deleted

我想知道这个,因为我正在使用内联表单集,并且我想仅在图片不属于订单时才显示“删除”复选框。在上面的示例中,我希望“删除”复选框仅出现在图2中。我可以在模板中使用if语句实现该功能,但我需要视图逻辑。

任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:2)

由于您从Picture到Event明确拥有外键,因此这应该像event.picture_set.all()一样简单。

修改

要排除OrderItem中显示的项目,您可以执行以下操作:

event.pictures.filter(orderitem=None)