Wednesday, February 28, 2018

RE: How to get Foreign Key Objects programmatically?

You may want to look at the model _meta API.

https://docs.djangoproject.com/en/2.0/ref/models/meta/

 

You are looking for a list of all the ForeignKeys, but you also probably want other relations such as OneToOne and ManyToMany.

You probably want something like the get_all_related_objects method:

https://docs.djangoproject.com/en/2.0/ref/models/meta/#migrating-from-the-old-api

 

The fields have an attribute called is_relation, one_to_one, and many_to_one.

 

 

From: django-users@googlegroups.com [mailto:django-users@googlegroups.com] On Behalf Of Rob Schneider
Sent: Tuesday, February 27, 2018 10:46 PM
To: django-users@googlegroups.com
Subject: Re: How to get Foreign Key Objects programmatically?

 

Still a mystery to me.

 

--rms

 


On 28 Feb 2018, at 03:22, Malik Rumi <malik.a.rumi@gmail.com> wrote:

Did you ever find an answer? If so, do you mind sharing it? Thanks.

On Sunday, October 29, 2017 at 9:33:10 AM UTC-7, rmschne wrote:

I'm using Django as front end to a MySQL database. User interface is a terminal program, not a web site.

 

I've written a very simple generic function to edit the fields of one record of a Django "object".  It works fine for editing editable fields. User specifies which field, then is shown the current value, raw_input() for the new value, then save() the record.

 

For fields that connect to Foreign Keys, what I want to do is present to user a simple list of Foreign Key records, from which the user will pick the relevant ID.  I know, given a list and the ID, how to then edit the record by doing a Django get(id=ID) on the Foreign Key table.  What I'm having trouble doing is figuring how

 

1. Identify into a variable the name of the Foreign Key table/object

2. Then with that variable do a call to the relevant Foreign Key table, e.g. ForeignKeyTable.objects.all()

 

See code below for <===WHAT I DO NOT KNOW HOW TO DO IN CODE Below.  I think I need some Django function that gives me the foreign key table in some useable generic form.

 

Hope all this makes sense. 

 

--rms

 

def EditDjangoObjectData(djangoobject,show=False,editonerecord=False):

    """

    EditDjangoObjectData()

        djangoojbect=a django object, e.g. a record in a table

    """

    print "\n****ToDo Note: This routine not yet working on fields with foreign keys!"

    changelist=[]

    ok=True

    while ok:

        change=None

        fields = [(f.name, f.editable) for f in djangoobject._meta.get_fields()]

        if show:

            print "\nfields:\n",fields

            print "django object:\n",djangoobject

        s="\nEditable Fields ('enter' to return): \n"

        fieldlist=[]

        for i in fields:

            if i[1]:   # only for 'editable' fields

                if i[0].lower() <> "id":

                    s=s+i[0]+", "

                    fieldlist.append(i[0])

        s=s+"DELETE or '?'"

        fieldok=False

        while not fieldok:

            fieldtochange=raw_input("Enter field name to change:\n"+s+": ")

            if not fieldtochange:

                return None

            elif fieldtochange.upper()=="DELETE":

                ans=raw_input("...Confirm DELETE by typing 'DELETE': ")

                try:

                    if ans=="DELETE":

                        rtn=djangoobject.delete()

                        print "Deleted. ",rtn

                        return rtn

                except:

                    print "***DELETE Failed.",sys.exc_info()[0]

                    ans=raw_input("Press 'Enter' to continue ... ")

            elif fieldtochange=="?":

                PrintObjectDetails(djangoobject)

            elif fieldtochange in fieldlist:

                fieldok=True

            else:

                print "\n****Error. ",fieldtochange,"is not in list. Try again."

        print "Current Value of Field to Change:",fieldtochange,"is:",getattr(djangoobject, fieldtochange)

**

** In here add some code to show a list of the foreign key records for user to select, e.g. ID, Description, 

**for r in ForeignKey.objects.all():   <== WHAT I DO NOT KNOW HOW TO DO IN CODE.

**    print i.id, i.description

**ID=raw_input("Enter ID:)

**foreignkeyobject=ForeignKey.objects.get(id=ID)    <== WHAT I DO NOT KNOW HOW TO DO IN CODE.

** ... then put that object into the relevant field 

        newvalue=raw_input("Enter New Value: ")

        change="changed ["+fieldtochange+"]"

        print "\nTo Save   :",djangoobject

        print "The Change:",change,"to",newvalue

        if not newvalue:

            return None

        elif newvalue.lower()=="none":

            newvalue=None

        elif newvalue.lower()=="true":

            newvalue==True

        elif newvalue.lower()=="false":

            newvalue=False

        setattr(djangoobject, fieldtochange, newvalue)

        try:

            djangoobject.save()

            print ": Success. Saved:",change,"to",newvalue

            print ": New Object:",djangoobject

            changelist.append(change)

            print "ChangeList:",changelist

        except:

            print "***Save Failed.",sys.exc_info()[0]

            ans=raw_input("Press 'Enter' to continue ... ")

        if editonerecord:

            ok=False

    return changelist

 

--
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/django-users/ShjLffcxFDk/unsubscribe.
To unsubscribe from this group and all its topics, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/e6ddd293-66ac-496a-94d4-10fd44cb1224%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/8EC6426B-DA91-4C27-97C1-C9D7A820E79A%40gmail.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment