Запросы к таблицам базы данных - PullRequest
0 голосов
/ 16 октября 2010

У меня есть таблицы Django, подобные следующим (я удалил ненужные поля):

class Person(models.Model):
    nameidx = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=300, verbose_name="Name")     
class Owner(models.Model):
    id = models.IntegerField(primary_key=True) 
    nameidx = models.IntegerField(null=True, blank=True) # is Person.nameidx
    structidx = models.IntegerField() # is PlaceRef.structidx
class PlaceRef(models.Model):
    id = models.IntegerField(primary_key=True) 
    structidx = models.IntegerField() # used for many things and not equivalent to placeidx
    placeidx = models.IntegerField(null=True, blank=True) # is Place.placeidx
class Place(models.Model):
    placeidx = models.IntegerField(primary_key=True) 
    county = models.CharField(max_length=36, null=True, blank=True)
    name = models.CharField(max_length=300)

Мой вопрос заключается в следующем. Если в моем файле views.py у меня есть Person, на который ссылается имя, и я хочу выяснить все места, которыми они владеют как QuerySet, что мне делать?

Я могу получить это далеко:

person = Person.objects.get(name=name)
owned_relations = Owner.objects.filter(nameidx=nameidx)

Как мне добраться отсюда до места? Должен ли я использовать методы базы данных?

Я также не уверен, должен ли я использовать ForeignKey для, например. Owner.nameidx.

Спасибо и извинения за этот чрезвычайно простой вопрос. Я не уверен, как изучать основы запросов к базе данных, кроме как пытаться, терпеть неудачу, спрашивать SO, пытаться снова ...:)

Ответы [ 2 ]

1 голос
/ 17 октября 2010

Весь смысл внешних ключей для таких целей, как ваше. Если вы уже знаете, что Owner.nameidx относится к Person, почему бы не сделать его внешним ключом (или полем OneToOne) для таблицы Person? Мало того, что вы получаете преимущество ссылочной целостности - это делает невозможным ввод значения для nameidx, которое не является действительным лицом, - Django ORM даст вам возможность легко «отслеживать» отношения:

owned_places = Place.objects.filter(placeref__owner__person=my_person)

даст вам все места, принадлежащие my_person.

Кстати, вам не нужно определять отдельные поля первичного ключа - Django сделает это за вас и сделает их полями автоинкремента, что почти всегда то, что вы хотите.

0 голосов
/ 16 октября 2010

Если бы вы могли изменить дизайн. Затем

 In owner nameidx can be a foreign key to Person(nameidx)
 Placeref(structidx) could be a foreign key to Owner(structidx) and 
 Place(placeidx) could be a foreign key Place ref(placeidx)

Тогда вы могли бы легко определить стоимость места

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...