Frage

This seems a silly, simple question. I'm going round in circles trying to get this work, but I can't see the wood for the trees.

Given a simple model such as (I've skipped the imports):

class Location(models.Model):
    description = model.CharField(max_length=40)
    address1 = model.CharField(max_length=40)
    # ..... (and so on)
    tel = model.CharField(max_length=12)

and another with a relationship to it:

class InformationRequest(models.Model):
    source = models.ForeignKey(Location)
    request_date = Models.DateField(default=datetime.now())
    # ..... (and so on)

How do I add a field that references the 'tel' field from the Location model in such a way that it can be populated automatically or from a select list in Django admin.

War es hilfreich?

Lösung

OK, if I get this right than you are, nomen est omen, thoroughly confusing the way that relational databases work :] One of key principles is to eliminate redundancy. There shouldn't be the very same piece of data stored in two tables that are related to one another.

I think that your current models are correct. Given these instances (I'm ignoring the fact that you have other, non-nullable fields)...

>>> loc = Location()
>>> loc.tel = "123"
>>> loc.save()
>>> info = InformationRequest()
>>> info.source = loc
>>> info.save()

...you can access tel from InformationRequest instance just like this:

>>> info.source.tel
'123'

You can also create a method...

class InformationRequest(models.Model):
    source = models.ForeignKey(Location, related_name="information_requests")
    request_date = Models.DateField(default=datetime.now())
    # ..... (and so on)

    def contact_tel(self):
        return self.source.tel

... and get it like this:

>>> info.contact_tel()
'123'

You can even trick it into being an attribute...

class InformationRequest(models.Model):
    source = models.ForeignKey(Location, related_name="information_requests")
    request_date = Models.DateField(default=datetime.now())
    # ..... (and so on)

    @property
    def contact_tel(self):
        return self.source.tel

... and get it without parentheses:

>>> info.contact_tel
'123'

Anyway, you should work your way around it programatically. Hope that helps.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top