【问题标题】:Django ForeignKey Relationship ConstraintDjango外键关系约束
【发布时间】:2015-11-22 18:12:26
【问题描述】:

我能否强制建立ForeignKey 关系,以使由记者撰写的文章不能由其他记者撰写?

我正在尝试实现“对象包含”并支持将文章分配给Reporter“文件夹”。

例如,ReporterOne“文件夹”包含 Articles A,B,C,如果 Articles A,B,C 被“分配”到“(即包含在)ReporterOne 的文件夹中,它们不能分配ReporterTwo

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    使用OneToOneField。来自文档:

    要定义一对一关系,请使用 OneToOneField。在此示例中,Place 可以选择是 Restaurant

    from django.db import models
    
    class Place(models.Model):
        name = models.CharField(max_length=50)
        address = models.CharField(max_length=80)
    
        def __str__(self):              # __unicode__ on Python 2
            return "%s the place" % self.name
    
    class Restaurant(models.Model):
        place = models.OneToOneField(Place, primary_key=True)
        serves_hot_dogs = models.BooleanField(default=False)
        serves_pizza = models.BooleanField(default=False)
    
        def __str__(self):              # __unicode__ on Python 2
            return "%s the restaurant" % self.place.name
    
    class Waiter(models.Model):
        restaurant = models.ForeignKey(Restaurant)
        name = models.CharField(max_length=50)
    
        def __str__(self):              # __unicode__ on Python 2
            return "%s the waiter at %s" % (self.name, self.restaurant)
    

    【讨论】:

    • 如何强制将文章 A 包含在 ReporterOne 的文件夹中?似乎这样只能确保每个记者写一篇文章,但不能确保一个文件夹中的特定文章。
    【解决方案2】:

    Article 具有 ForeignKeyReporter。因此,每个Article 将只属于一个Reporter。然后将名为folder 的属性添加到Article,并将其用作哈希键来确定folder 中“包含”了哪些Articles

    要查找给定Reporter 名为Foofolder 中的所有Articles,您可以执行如下查询:

    reporter = Reporter.objects.first()
    articles_in_folder = reporter.articles_set.filter(folder='Foo')
    

    请注意,folder 也可以是一个完整的模型,而不仅仅是一个字符串。 Article 将有一个 ForeingKey 到 folderfolder 也可以有一个 ForeingKeyReporter

    【讨论】:

    • 你也可以做 Reporter - ForeingKey -> Folder - ForeingKey -> Article,但这需要一个文件夹的存在才能有文章。
    猜你喜欢
    • 2020-03-17
    • 2019-03-27
    • 2017-04-20
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多